Project Name: ניתוח תאונות הדרכים בישראל עם נפגעים קל בשנים 2021-2023¶
Project team members:¶
- ויסמן מאור
- אלישיב סונר
- יותם יפרח
Project number: 10¶
תיאור הפרויקט:¶
הפרויקט עוסק בניתוח נתונים של תאונות דרכים עם נפגעים קל בישראל בשנים 2021-2023. המטרה היא להבין את המגמות והגורמים העיקריים לתאונות מסוג זה, תוך התמקדות במאפיינים גיאוגרפיים, זמניים וסוגי רכבים מעורבים. הניתוח יאפשר להפיק תובנות שיכולות לתרום לשיפור אמצעי הבטיחות והפחתת תאונות עתידיות.
הגדרה של פצוע קל¶
פצוע קל בתאונת דרכים: אדם שנפצע בתאונת דרכים ולא אושפז בבית חולים, אדם שאושפז בבית חולים ומדד חומרת פציעתו היה 2-1 או אדם שאושפז לצורך השגחה בלבד
Link to the data:¶
הקובץ התקבל באישור שימוש על ידי הלישכה המרכזית לסטטיטסטיקה, לאחר שהחומר הגיע הכנסתי אותו לגיטהאב בקישור הבא:¶
https://raw.githubusercontent.com/MaorWN/FirstL/main/H20211163AccData.csv נתוני תאונות דרכים לשנת 2021 https://raw.githubusercontent.com/MaorWN/FirstL/main/H20221162AccData.csv נתוני תאונות דרכים לשנת 2022 https://raw.githubusercontent.com/MaorWN/FirstL/main/H20231161AccData.csv נתוני תאונות דרכים לשנת 2023
https://raw.githubusercontent.com/MaorWN/FirstL/main/accdata.csv
Read you file from Github:¶
!pip install arabic-reshaper
!pip install python-bidi
!pip install matplotlib
!pip install python-bidi
!pip install pandas folium pyproj matplotlib
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import arabic_reshaper
from bidi.algorithm import get_display
import folium
from folium.plugins import MarkerCluster, HeatMap
from pyproj import Transformer
import matplotlib.cm as cm
import matplotlib.colors as mcolors
import matplotlib
Requirement already satisfied: arabic-reshaper in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (3.0.0) Requirement already satisfied: python-bidi in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (0.6.6) Requirement already satisfied: matplotlib in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (3.10.3) Requirement already satisfied: contourpy>=1.0.1 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from matplotlib) (1.3.2) Requirement already satisfied: cycler>=0.10 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from matplotlib) (0.12.1) Requirement already satisfied: fonttools>=4.22.0 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from matplotlib) (4.58.1) Requirement already satisfied: kiwisolver>=1.3.1 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from matplotlib) (1.4.8) Requirement already satisfied: numpy>=1.23 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from matplotlib) (1.26.4) Requirement already satisfied: packaging>=20.0 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from matplotlib) (25.0) Requirement already satisfied: pillow>=8 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from matplotlib) (11.2.1) Requirement already satisfied: pyparsing>=2.3.1 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from matplotlib) (3.2.3) Requirement already satisfied: python-dateutil>=2.7 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from matplotlib) (2.9.0.post0) Requirement already satisfied: six>=1.5 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from python-dateutil>=2.7->matplotlib) (1.17.0) Requirement already satisfied: python-bidi in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (0.6.6) Requirement already satisfied: pandas in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (2.3.0) Requirement already satisfied: folium in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (0.19.7) Requirement already satisfied: pyproj in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (3.7.1) Requirement already satisfied: matplotlib in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (3.10.3) Requirement already satisfied: numpy>=1.23.2 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from pandas) (1.26.4) Requirement already satisfied: python-dateutil>=2.8.2 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from pandas) (2.9.0.post0) Requirement already satisfied: pytz>=2020.1 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from pandas) (2025.2) Requirement already satisfied: tzdata>=2022.7 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from pandas) (2025.2) Requirement already satisfied: branca>=0.6.0 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from folium) (0.8.1) Requirement already satisfied: jinja2>=2.9 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from folium) (3.1.6) Requirement already satisfied: requests in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from folium) (2.32.3) Requirement already satisfied: xyzservices in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from folium) (2025.4.0) Requirement already satisfied: certifi in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from pyproj) (2025.4.26) Requirement already satisfied: contourpy>=1.0.1 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from matplotlib) (1.3.2) Requirement already satisfied: cycler>=0.10 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from matplotlib) (0.12.1) Requirement already satisfied: fonttools>=4.22.0 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from matplotlib) (4.58.1) Requirement already satisfied: kiwisolver>=1.3.1 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from matplotlib) (1.4.8) Requirement already satisfied: packaging>=20.0 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from matplotlib) (25.0) Requirement already satisfied: pillow>=8 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from matplotlib) (11.2.1) Requirement already satisfied: pyparsing>=2.3.1 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from matplotlib) (3.2.3) Requirement already satisfied: MarkupSafe>=2.0 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from jinja2>=2.9->folium) (3.0.2) Requirement already satisfied: six>=1.5 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from python-dateutil>=2.8.2->pandas) (1.17.0) Requirement already satisfied: charset-normalizer<4,>=2 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from requests->folium) (3.4.2) Requirement already satisfied: idna<4,>=2.5 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from requests->folium) (3.10) Requirement already satisfied: urllib3<3,>=1.21.1 in c:\users\lihin\appdata\local\programs\python\python311\lib\site-packages (from requests->folium) (2.4.0)
# בקוד זה יש המרה של הערכים הנמצאים בטבלה הראשית בטבלת ההמרה הנמצאת בקובץ קודבוק ולאחר מכן נוכל לעבוד עם
# accdata לכל אורך הפרויקט
url_list = [
r'https://raw.githubusercontent.com/MaorWN/FirstL/main/H20211163AccData.csv',
r'https://raw.githubusercontent.com/MaorWN/FirstL/main/H20221162AccData.csv',
r'https://raw.githubusercontent.com/MaorWN/FirstL/main/H20231161AccData.csv'
]
# שליפת נתוני הקבצים למקור אחד
accdata = pd.concat([pd.read_csv(url, encoding='cp1255') for url in url_list], ignore_index=True)
VehData=pd.read_csv("https://raw.githubusercontent.com/MaorWN/FirstL/main/RehevData.csv", encoding="cp1255")
#הנתונים מחולקים דרך הלמס למספר טבלאות, הטבלאות שצירפנו הן טבלת פרטי התאונה וטבלת סוגי כלי הרכב שהיו מעורבים,
#היה צורך לאחד ביניהם כאשר העמודה הראשונה היא עמודת המפתח
# חיבור בין הטבלאות על פי העמודה הראשונה (ID) רק אם יש התאמה (inner join)
accdata = pd.merge(accdata, VehData, on=accdata.columns[0], how='inner')
codebook = pd.read_csv("https://raw.githubusercontent.com/MaorWN/FirstL/main/Codebook.csv", encoding="cp1255")
def reshape_hebrew(text):
reshaped = arabic_reshaper.reshape(str(text))
return get_display(reshaped)
# ניקוי רווחים משמות העמודות
codebook.columns = codebook.columns.str.strip()
accdata['SHAA_CLEAN'] = (accdata['SHAA'] - 1)//4 #תיקון ערך השעה
accdata = accdata[~accdata['YEHIDA'].isin([53, 'מרחב שמשון (החל ב-2004)'])] #ניקוי ערכים בעייתיים
# טיפול בעמודות מתוך הקודבוק
for col_name in codebook['שם משתנה'].dropna().unique():
if col_name in accdata.columns:
relevant_rows = codebook[codebook['שם משתנה'] == col_name]
mapping_df = relevant_rows.drop_duplicates(subset='קוד')
mapping = dict(zip(mapping_df['קוד'], mapping_df['מאפיינים']))
# החלפת הערכים בטבלה הראשית
accdata[col_name] = accdata[col_name].map(mapping).fillna(accdata[col_name])
accdata.info()
<class 'pandas.core.frame.DataFrame'> Index: 129454 entries, 0 to 129485 Data columns (total 63 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 pk_teuna_fikt 129454 non-null int64 1 sug_tik 129454 non-null object 2 THUM_GEOGRAFI 129454 non-null object 3 SUG_DEREH 129454 non-null object 4 SEMEL_YISHUV 129454 non-null float64 5 REHOV1 64500 non-null float64 6 REHOV2 7903 non-null float64 7 BAYIT 86209 non-null float64 8 ZOMET_IRONI 7901 non-null float64 9 KVISH1 35080 non-null float64 10 KVISH2 34520 non-null float64 11 KM 33692 non-null float64 12 ZOMET_LO_IRONI 10806 non-null float64 13 YEHIDA 129454 non-null object 14 SHNAT_TEUNA_x 129454 non-null int64 15 HODESH_TEUNA_x 129454 non-null int64 16 YOM_BE_HODESH 129454 non-null int64 17 SHAA 129454 non-null float64 18 SUG_YOM 129454 non-null object 19 YOM_LAYLA 129454 non-null object 20 YOM_BASHAVUA 129454 non-null object 21 RAMZOR 129454 non-null object 22 HUMRAT_TEUNA 129454 non-null object 23 SUG_TEUNA 129454 non-null object 24 ZURAT_DEREH 129454 non-null object 25 HAD_MASLUL 129454 non-null object 26 RAV_MASLUL 129454 non-null object 27 MEHIRUT_MUTERET 129454 non-null object 28 TKINUT 129454 non-null object 29 ROHAV 129454 non-null object 30 SIMUN_TIMRUR 129454 non-null object 31 TEURA 129454 non-null object 32 BAKARA 1366 non-null object 33 MEZEG_AVIR 129454 non-null object 34 PNE_KVISH 129454 non-null object 35 SUG_EZEM 129454 non-null object 36 MERHAK_EZEM 129454 non-null object 37 LO_HAZA 129454 non-null object 38 OFEN_HAZIYA 129454 non-null object 39 MEKOM_HAZIYA 129454 non-null object 40 KIVUN_HAZIYA 129454 non-null object 41 MAHOZ 129454 non-null float64 42 NAFA 129454 non-null float64 43 EZOR_TIVI 129454 non-null float64 44 MAAMAD_MINIZIPALI 93916 non-null float64 45 ZURAT_ISHUV 94163 non-null float64 46 STATUS_IGUN 129454 non-null int64 47 X 129161 non-null float64 48 Y 129161 non-null float64 49 mispar_rehev_fikt 129454 non-null int64 50 SHNAT_TEUNA_y 129454 non-null int64 51 HODESH_TEUNA_y 129454 non-null int64 52 NEFAH 129454 non-null int64 53 SHNAT_YITZUR 129454 non-null float64 54 KIVUNE_NESIA 129454 non-null float64 55 MATZAV_REHEV 129454 non-null object 56 SHIYUH_REHEV_LMS 129454 non-null object 57 NEZEK 129454 non-null object 58 SUG_REHEV_LMS 129454 non-null object 59 MEKOMOT_YESHIVA_LMS 129454 non-null float64 60 MISHKAL_KOLEL_LMS 113424 non-null float64 61 SUG_TIK 129454 non-null float64 62 SHAA_CLEAN 129454 non-null int64 dtypes: float64(22), int64(10), object(31) memory usage: 63.2+ MB
codebook.head(15)
| מ- | עד | שם שדה | שם משתנה | טיפוס | קוד | מאפיינים | מקור | |
|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 10 | מספר תאונה פיקטיבי | PK_TEUNA_FIKT | N10 | NaN | NaN | NaN |
| 1 | 11 | 18 | סוג תיק | sug_tik | N8 | 3.0 | כללי עם נפגעים קל | NaN |
| 2 | 19 | 26 | תחום גאוגרפי | THUM_GEOGRAFI | N8 | 1.0 | ישראל ללא יהודה ושומרון | NaN |
| 3 | 19 | 26 | תחום גאוגרפי | THUM_GEOGRAFI | N8 | 2.0 | יהודה והשומרון | NaN |
| 4 | 27 | 34 | סוג דרך | SUG_DEREH | N8 | 1.0 | עירוני בצומת | NaN |
| 5 | 27 | 34 | סוג דרך | SUG_DEREH | N8 | 2.0 | עירוני לא בצומת | NaN |
| 6 | 27 | 34 | סוג דרך | SUG_DEREH | N8 | 3.0 | לא עירוני בצומת | NaN |
| 7 | 27 | 34 | סוג דרך | SUG_DEREH | N8 | 4.0 | לא עירוני לא בצומת | NaN |
| 8 | 35 | 42 | סמל ישוב | SEMEL_YISHUV | N8 | NaN | NaN | NaN |
| 9 | 35 | 42 | ראה קובץ "רשימת ישובים ואוכלסיתם" בנספח המתודו... | SEMEL_YISHUV | N8 | NaN | NaN | NaN |
| 10 | 43 | 50 | רחוב 1 | REHOV1 | N8 | NaN | NaN | מילון רחובות |
| 11 | 51 | 58 | רחוב 2 | REHOV2 | N8 | NaN | NaN | מילון רחובות |
| 12 | 59 | 66 | מס' בית | MISPAR_BAIT | N8 | NaN | NaN | NaN |
| 13 | 67 | 74 | צומת עירוני | ZOMET_IRONI | N8 | NaN | NaN | מילון צמתים עירוניים |
| 14 | 75 | 82 | דרך לא עירונית 1 | KVISH1 | N8 | NaN | NaN | NaN |
Describe the data¶
- How many rows?
- How many columns?
- How many numeric columns? (not including numerical identifiers - numbers that uniquely define the row)
- How many categorical columns? (not including string identifiers - values that uniquely define the row)
num_rows = accdata.shape[0]
num_rows
129454
num_columns = accdata.shape[1]
num_columns
63
# חישוב עמודות מספריות
numeric_columns = [col for col in accdata.columns if pd.api.types.is_numeric_dtype(accdata[col])]
# חישוב עמודות קטגוריאליות (מעודכן כדי לשלול את האזהרה)
categorical_columns = [col for col in accdata.columns if isinstance(accdata[col].dtype, pd.CategoricalDtype) or accdata[col].dtype == 'object']
# נשלול את עמודות המזהים הייחודיים (כאשר כל הערכים בעמודה ייחודיים)
non_unique_numeric_columns = [col for col in numeric_columns if accdata[col].nunique() != len(accdata)]
non_unique_categorical_columns = [col for col in categorical_columns if accdata[col].nunique() != len(accdata)]
# הצגת התוצאות
print(f"Number of numeric columns (excluding unique identifiers): {len(non_unique_numeric_columns)}")
print(f"Number of categorical columns (excluding string identifiers): {len(non_unique_categorical_columns)}")
Number of numeric columns (excluding unique identifiers): 31 Number of categorical columns (excluding string identifiers): 31
accdata.columns
Index(['pk_teuna_fikt', 'sug_tik', 'THUM_GEOGRAFI', 'SUG_DEREH',
'SEMEL_YISHUV', 'REHOV1', 'REHOV2', 'BAYIT', 'ZOMET_IRONI', 'KVISH1',
'KVISH2', 'KM', 'ZOMET_LO_IRONI', 'YEHIDA', 'SHNAT_TEUNA_x',
'HODESH_TEUNA_x', 'YOM_BE_HODESH', 'SHAA', 'SUG_YOM', 'YOM_LAYLA',
'YOM_BASHAVUA', 'RAMZOR', 'HUMRAT_TEUNA', 'SUG_TEUNA', 'ZURAT_DEREH',
'HAD_MASLUL', 'RAV_MASLUL', 'MEHIRUT_MUTERET', 'TKINUT', 'ROHAV',
'SIMUN_TIMRUR', 'TEURA', 'BAKARA', 'MEZEG_AVIR', 'PNE_KVISH',
'SUG_EZEM', 'MERHAK_EZEM', 'LO_HAZA', 'OFEN_HAZIYA', 'MEKOM_HAZIYA',
'KIVUN_HAZIYA', 'MAHOZ', 'NAFA', 'EZOR_TIVI', 'MAAMAD_MINIZIPALI',
'ZURAT_ISHUV', 'STATUS_IGUN', 'X', 'Y', 'mispar_rehev_fikt',
'SHNAT_TEUNA_y', 'HODESH_TEUNA_y', 'NEFAH', 'SHNAT_YITZUR',
'KIVUNE_NESIA', 'MATZAV_REHEV', 'SHIYUH_REHEV_LMS', 'NEZEK',
'SUG_REHEV_LMS', 'MEKOMOT_YESHIVA_LMS', 'MISHKAL_KOLEL_LMS', 'SUG_TIK',
'SHAA_CLEAN'],
dtype='object')
pd.set_option('display.max_columns', None) # מציג את כל העמודות בלי קיצור
accdata.head()
| pk_teuna_fikt | sug_tik | THUM_GEOGRAFI | SUG_DEREH | SEMEL_YISHUV | REHOV1 | REHOV2 | BAYIT | ZOMET_IRONI | KVISH1 | KVISH2 | KM | ZOMET_LO_IRONI | YEHIDA | SHNAT_TEUNA_x | HODESH_TEUNA_x | YOM_BE_HODESH | SHAA | SUG_YOM | YOM_LAYLA | YOM_BASHAVUA | RAMZOR | HUMRAT_TEUNA | SUG_TEUNA | ZURAT_DEREH | HAD_MASLUL | RAV_MASLUL | MEHIRUT_MUTERET | TKINUT | ROHAV | SIMUN_TIMRUR | TEURA | BAKARA | MEZEG_AVIR | PNE_KVISH | SUG_EZEM | MERHAK_EZEM | LO_HAZA | OFEN_HAZIYA | MEKOM_HAZIYA | KIVUN_HAZIYA | MAHOZ | NAFA | EZOR_TIVI | MAAMAD_MINIZIPALI | ZURAT_ISHUV | STATUS_IGUN | X | Y | mispar_rehev_fikt | SHNAT_TEUNA_y | HODESH_TEUNA_y | NEFAH | SHNAT_YITZUR | KIVUNE_NESIA | MATZAV_REHEV | SHIYUH_REHEV_LMS | NEZEK | SUG_REHEV_LMS | MEKOMOT_YESHIVA_LMS | MISHKAL_KOLEL_LMS | SUG_TIK | SHAA_CLEAN | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2020007043 | כללי עם נפגעים קל | ישראל ללא יהודה ושומרון | עירוני לא בצומת | 7400.0 | NaN | NaN | 9999.0 | NaN | NaN | NaN | NaN | NaN | מרחב השרון | 2021 | 1 | 29 | 44.0 | יום אחר | יום | שישי | לא ידוע | קלה | התנגשות עם עצם דומם | אחר | לא ידוע מספר מסלולים | 0 | לא ידוע | לא ידוע | לא ידוע | לא ידוע | יום לא ידוע | NaN | לא ידוע | לא ידוע | לא ידוע | לא ידוע | לא ידוע | 0 | 0 | לא ידוע | 4.0 | 41.0 | 411.0 | 0.0 | 13.0 | 2 | 187251.0 | 691402.0 | 1 | 2021 | 1 | 8 | 2015.0 | 0.0 | 0 | ישראלי | אין נזק | רכב נוסעים פרטי | 99.0 | 2.0 | 3.0 | 10 |
| 1 | 2020044999 | כללי עם נפגעים קל | ישראל ללא יהודה ושומרון | עירוני לא בצומת | 5000.0 | 1040.0 | NaN | 9999.0 | NaN | NaN | NaN | NaN | NaN | מרחב ת"א | 2021 | 1 | 18 | 85.0 | יום אחר | לילה | שני | לא ידוע | קלה | התנגשות צד בצד | אחר | לא ידוע מספר מסלולים | 0 | לא ידוע | לא ידוע | לא ידוע | לא ידוע | לילה לא ידוע | NaN | לא ידוע | לא ידוע | לא ידוע | לא ידוע | לא ידוע | 0 | 0 | לא ידוע | 5.0 | 51.0 | 511.0 | 0.0 | 13.0 | 3 | 179553.0 | 665859.0 | 1 | 2021 | 1 | 2 | 2019.0 | 0.0 | 0 | ישראלי | אין נזק | אופנוע 126 עד 400 סמ"ק | 1.0 | NaN | 3.0 | 21 |
| 2 | 2020058555 | כללי עם נפגעים קל | ישראל ללא יהודה ושומרון | עירוני לא בצומת | 5000.0 | 180.0 | NaN | 9999.0 | NaN | NaN | NaN | NaN | NaN | מרחב ת"א | 2021 | 1 | 7 | 69.0 | יום אחר | לילה | חמישי | לא ידוע | קלה | התנגשות חזית באחור | אחר | לא ידוע מספר מסלולים | 0 | לא ידוע | לא ידוע | לא ידוע | לא ידוע | לילה לא ידוע | NaN | לא ידוע | לא ידוע | לא ידוע | לא ידוע | לא ידוע | 0 | 0 | לא ידוע | 5.0 | 51.0 | 511.0 | 0.0 | 13.0 | 3 | 181474.0 | 667671.0 | 1 | 2021 | 1 | 6 | 2008.0 | 0.0 | 0 | ישראלי | אין נזק | רכב נוסעים פרטי | 3.0 | NaN | 3.0 | 17 |
| 3 | 2020062959 | כללי עם נפגעים קל | ישראל ללא יהודה ושומרון | עירוני לא בצומת | 9100.0 | NaN | NaN | 9999.0 | NaN | NaN | NaN | NaN | NaN | מרחב גליל | 2021 | 1 | 16 | 49.0 | יום אחר | יום | שבת | לא ידוע | קלה | התנגשות עם עצם דומם | אחר | לא ידוע מספר מסלולים | 0 | לא ידוע | לא ידוע | לא ידוע | לא ידוע | יום לא ידוע | NaN | לא ידוע | לא ידוע | עמוד חשמל/תאורה/טלפון | לא ידוע | לא ידוע | 0 | 0 | לא ידוע | 2.0 | 24.0 | 245.0 | 0.0 | 15.0 | 2 | 209450.0 | 768109.0 | 1 | 2021 | 1 | 6 | 2007.0 | 0.0 | 0 | ישראלי | אין נזק | רכב נוסעים פרטי | 99.0 | NaN | 3.0 | 12 |
| 4 | 2020081527 | כללי עם נפגעים קל | ישראל ללא יהודה ושומרון | עירוני לא בצומת | 1290.0 | NaN | NaN | 9999.0 | NaN | NaN | NaN | NaN | NaN | מרחב השרון | 2021 | 1 | 4 | 56.0 | יום אחר | יום | שני | לא ידוע | קלה | התנגשות חזית אל צד | אחר | לא ידוע מספר מסלולים | 0 | לא ידוע | לא ידוע | לא ידוע | לא ידוע | יום לא ידוע | NaN | לא ידוע | לא ידוע | לא ידוע | לא ידוע | לא ידוע | 0 | 0 | לא ידוע | 4.0 | 41.0 | 412.0 | 99.0 | 28.0 | 2 | 203505.0 | 696817.0 | 1 | 2021 | 1 | 9 | 2005.0 | 0.0 | 0 | ישראלי | אין נזק | משא עד 3.5 טון - לא אחוד (טנדר) | 3.0 | 2.0 | 3.0 | 13 |
Write three questions you would like to answer using this data¶
🚗-ניתוח תאונות לפי סוג תאונה וסוג דרך -1¶
בניתוח זה נבחן כיצד מתפלגות התאונות לפי סוג התאונה (למשל: פגיעת חזית, הולך רגל) ולפי סוג הדרך (עירונית, בין־עירונית). נבדוק גם האם ישנה השפעה של שנת הייצור וסוגי הרכבים המעורבים לכמות תאונות הדרכים?
המטרה היא להבין אילו סוגי תאונות בולטים באילו דרכים, ולזהות דפוסים שיכולים לסייע במניעת תאונות עתידיות.
🔎 ניתוח תאונות לפי יום בשבוע ויחידת משטרה-2¶
🔹 איזה יחידות משטרה מתמודדות עם עומס תאונות גבוה?¶
🔹 האם יש קשר בין יום בשבוע ליחידת משטרה?¶
בניתוח זה נבדוק אילו יחידות משטרה מדווחות על מספר תאונות גבוה במיוחד, והאם קיימת השפעה של יום בשבוע על כמות התאונות בכל יחידה.
המטרה היא להבין האם יש עומס ממוקד בימים מסוימים ובאזורים מסוימים, כדי לבחון אפשרות לייעול פריסת כוחות ופעולות מנע.
קורלציות בין משתנים¶
numeric_vars = ['SHAA_CLEAN', 'HODESH_TEUNA_x', 'SHNAT_YITZUR',
'YOM_BE_HODESH', 'MAHOZ']
# יצירת משתנים נוספים לניתוח
accdata['IS_WEEKEND'] = accdata['YOM_BASHAVUA'].isin(['ישיש', 'תבש']).astype(int)
accdata['IS_NIGHT'] = (accdata['YOM_LAYLA'] == 'לילה').astype(int)
accdata['IS_URBAN'] = accdata['SUG_DEREH'].isin(['עירוני לא-בצומת', 'עירוני בצומת']).astype(int)
# הוספת המשתנים החדשים
numeric_vars.extend(['IS_WEEKEND', 'IS_NIGHT', 'IS_URBAN'])
# חישוב מטריצת קורלציות
correlation_matrix = accdata[numeric_vars].corr()
plt.figure(figsize=(12, 10))
sns.heatmap(correlation_matrix,
annot=True,
cmap='RdBu_r',
center=0,
square=True,
fmt='.2f')
plt.title(reshape_hebrew('מטריצת קורלציות - משתני תאונות'))
plt.tight_layout()
plt.show()
📊 הקורלציות החזקות שמצאנו:
📊 הקורלציות החזקות שמצאנו:¶
🌙 שעה ולילה (0.34)¶
- ככל שהשעה מאוחרת יותר, יותר סיכוי שזה לילה
- מעשי: תאונות לילה מתרכזות בשעות מאוחרות (הגיוני)
🎯 סוף שבוע ולילה (0.07)¶
- קורלציה חלשה אבל חיובית
- מעשי: בסופי שבוע יש מעט יותר תאונות לילה
🏙️ מחוז ועירוני (0.11)¶
- יש הבדל קל בין מחוזות בסוג הדרכים
- מעשי: חלק מהמחוזות יותר דרכים עירוניים מאחרים
💡 מה זה אומר לנו:¶
✅ דברים טובים:¶
- המשתנים שיצרנו עובדים נכון
- אין קורלציות חזקות מדי (מעל 0.5) - זה טוב לניתוח
- הקשרים הגיוניים ומצפויים
⚠️ מגבלות המדגם:¶
- רוב הקורלציות קרובות לאפס (לבן במטריצה)
- המשתנים די עצמאיים זה מזה
- אין הרבה דפוסים חזקים
🎯 המסקנות המעשיות:¶
- תאונות לילה מתרכזות בשעות מאוחרות (ברור)
- סופי שבוע מעט יותר מסוכנים בלילה
- מחוזות שונים עם דפוסים שונים של דרכים עירוניות
🔍 למה כדאי להתמקד:¶
- ניתוח זמנים: שעות לילה בסופי שבוע
- הבדלים גיאוגרפיים: השוואה בין מחוזות
- דפוסי התנהגות: מה קורה בשעות שונות
סיכום:¶
הנתונים נקיים ומאורגנים, המשתנים עובדים טוב, ויש כמה דפוסים מעניינים לחקור יותר לעומק!
# ניתוח קורלציה בין שעה, חודש ומספר תאונות
correlation_data = accdata[['SHAA_CLEAN', 'HODESH_TEUNA_x', 'SHNAT_TEUNA_x']].corr()
plt.figure(figsize=(8, 6))
sns.heatmap(correlation_data, annot=True, cmap='RdBu_r', center=0)
plt.title(reshape_hebrew('מטריצת קורלציות - משתני זמן'))
plt.show()
כדי להעתיק את התוכן שלי בפורמט Markdown נקי, פשוט העתק את הטקסט הזה: markdown## סיכום מטריצת הקורלציות - משתני זמן
📊 מה אנחנו רואים במטריצה:¶
🕐 SHAA_CLEAN (שעת התאונה):
- קורלציה עם עצמה: 1.0 (ברור)
- קורלציה עם חודש: 0.0021 (כמעט אפס)
- קורלציה עם שנה: -0.0094 (כמעט אפס)
📅 HODESH_TEUNA_x (חודש התאונה):
- קורלציה עם שעה: 0.0021 (כמעט אפס)
- קורלציה עם עצמו: 1.0 (ברור)
- קורלציה עם שנה: -0.086 (חלשה ושלילית)
📆 SHNAT_TEUNA_x (שנת התאונה):
- קורלציה עם שעה: -0.0094 (כמעט אפס)
- קורלציה עם חודש: -0.086 (חלשה ושלילית)
- קורלציה עם עצמה: 1.0 (ברור)
💡 מה זה אומר במילים פשוטות:¶
🎯 העיקר:
- אין קשר בין שעת היום לחודש - תאונות קורות בכל שעה בכל חודש
- אין קשר בין שעת היום לשנה - דפוסי השעות לא השתנו בין השנים
- יש קשר חלש ושלילי בין חודש לשנה - אולי שינויים קלים בדפוסים החודשיים
🔍 המשמעות המעשית:
- עצמאות זמנית: השעה, החודש והשנה עצמאיים זה מזה
- יציבות דפוסים: דפוסי התאונות לא השתנו משמעותית בין השנים
✅ למה זה טוב:¶
- לעבודה שלנו: המשתנים הזמניים עצמאיים ולא משפיעים זה על זה
- לניתוח: אפשר לנתח כל משתנה זמני בנפרד
- לאמינות: הנתונים לא מוטים לטובת זמנים מסוימים
התפלגות סוגי התאונות על פני שלושת השנים 2021-2023¶
# עיצוב גרפים
sns.set(style="whitegrid", font="Arial")
plt.rcParams['axes.unicode_minus'] = False
# פונקציה לעיבוד טקסטים בעברית
def reshape_hebrew(text):
return get_display(arabic_reshaper.reshape(str(text)))
# ווידוא קיום DataFrame
assert 'accdata' in locals(), "DataFrame בשם accdata לא מוגדר"
# סינון ערכים חסרים
accdata = accdata[accdata['SUG_TEUNA'].notna()].copy()
# יצירת מילון ערכים מעובדים רק על ערכים ייחודיים
unique_vals = accdata['SUG_TEUNA'].unique()
hebrew_map = {val: reshape_hebrew(val) for val in unique_vals}
# החלפת הערכים לפי המילון
accdata['SUG_TEUNA_HE'] = accdata['SUG_TEUNA'].map(hebrew_map)
# עיבוד טקסטים לצירים
title = reshape_hebrew("התפלגות סוגי תאונות")
xlabel = reshape_hebrew("סוג תאונה")
ylabel = reshape_hebrew("מספר תאונות")
# יצירת גרף
plt.figure(figsize=(10, 6))
sns.countplot(
data=accdata,
x='SUG_TEUNA_HE',
hue='SUG_TEUNA_HE', # מוודא שכל עמודה תקבל צבע משלה
order=accdata['SUG_TEUNA_HE'].value_counts().index,
palette='Set2',
legend=False
)
plt.title(title)
plt.xlabel(xlabel)
plt.ylabel(ylabel)
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.show()
# עיצוב גרפים
sns.set(style="whitegrid", font="Arial")
plt.rcParams['axes.unicode_minus'] = False
# כותרות גרף
title = reshape_hebrew("התפלגות סוגי תאונות לפי שנים")
xlabel = reshape_hebrew("סוג תאונה")
ylabel = reshape_hebrew("מספר תאונות")
col_title = reshape_hebrew("שנה")
# בדיקה שעמודות קיימות
if 'SHNAT_TEUNA_x' in accdata.columns and 'SUG_TEUNA' in accdata.columns:
# סינון שורות עם ערכים חסרים
accdata = accdata[accdata['SUG_TEUNA'].notna()].copy()
# עיבוד טקסטים בעברית רק פעם אחת (מיפוי)
unique_vals = accdata['SUG_TEUNA'].unique()
teuna_map = {val: reshape_hebrew(val) for val in unique_vals}
accdata['SUG_TEUNA_HE'] = accdata['SUG_TEUNA'].map(teuna_map)
# עיבוד שנה למחרוזת
accdata['SHNAT_TEUNA_x'] = accdata['SHNAT_TEUNA_x'].astype(str)
# גרף
g = sns.catplot(
data=accdata,
x='SUG_TEUNA_HE',
hue='SUG_TEUNA_HE',
kind='count',
col='SHNAT_TEUNA_x',
col_wrap=3,
height=5,
aspect=1.5,
order=accdata['SUG_TEUNA_HE'].value_counts().index,
palette='Set2',
legend=False
)
g.set_titles(col_template=col_title + " {col_name}")
g.set_axis_labels(xlabel, ylabel)
for ax in g.axes.flat:
ax.tick_params(axis='x', rotation=80)
plt.subplots_adjust(top=0.85)
g.fig.suptitle(title, fontsize=16)
plt.show()
else:
print("אחת מהעמודות SHNAT_TEUNA_x או SUG_TEUNA לא קיימת.")
האם שנת הייצור של הרכב הוא הגורם לתאונה ? רכב ישן או חדש ?¶
import numpy as np
# סינון נתונים חסרים ושלא דווח מה שנת החחצור של כלי הרכב
df = accdata[(accdata['SHNAT_YITZUR'] != 0) & accdata['SHNAT_YITZUR'].notna() & accdata['SUG_REHEV_LMS'].notna()]
# קיבוץ וספירת תאונות לפי שנת ייצור וסוג רכב
pivot_data = df.pivot_table(index='SHNAT_YITZUR',
columns='SUG_REHEV_LMS',
values='pk_teuna_fikt',
aggfunc='count',
fill_value=0)
# מיון השנים בסדר עולה
pivot_data = pivot_data.sort_index()
# בחירת 10 סוגי רכב עם נפח גבוה ביותר
top_vehicles = pivot_data.sum().sort_values(ascending=False).head(10).index
pivot_data_top = pivot_data[top_vehicles]
# סינון שנים ללא תאונות בכלל
pivot_data_top = pivot_data_top.loc[~(pivot_data_top == 0).all(axis=1)]
# סינון שנים מ-1996 ואילך
pivot_data_top = pivot_data_top.loc[pivot_data_top.index >= 1996]
# ציור גרף עמודות מקוננות (stacked bar plot)
ax = pivot_data_top.plot(kind='bar', stacked=True, figsize=(16,7), colormap='tab20')
ax.set_xticks(np.arange(len(pivot_data_top.index)))
ax.set_xticklabels([int(year) for year in pivot_data_top.index])
# תיקון טקסט בעברית במקרא (legend)
handles, labels = ax.get_legend_handles_labels()
new_labels = [reshape_hebrew(label) for label in labels]
ax.legend(handles, new_labels, title=reshape_hebrew('סוג רכב'), bbox_to_anchor=(1.05, 1), loc='upper left')
# כותרות בצירים וגריד
plt.title(reshape_hebrew('כמות תאונות לפי שנת ייצור וסוג רכב'), fontsize=16)
plt.xlabel(reshape_hebrew('שנת ייצור'), fontsize=14)
plt.ylabel(reshape_hebrew('מספר תאונות'), fontsize=14)
plt.xticks(rotation=45)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
# נניח accdata כבר קיים וכולל את העמודה SHNAT_TEUNA_x
years = sorted(accdata['SHNAT_TEUNA_x'].dropna().unique())
num_years = len(years)
col_title = reshape_hebrew("שנת תאונה")
# הגבלת מספר גרפים (אפשר להתאים)
max_plots = 9
years_to_plot = years[:max_plots]
# קביעת גודל המטריצה של הגרפים (3 עמודות, כמה שורות)
cols = 3
rows = int(np.ceil(len(years_to_plot) / cols))
fig, axes = plt.subplots(rows, cols, figsize=(18, rows * 5), sharey=True)
# "שטוח" את מערך הצירים למקרה של שורה אחת בלבד
axes = axes.flatten() if num_years > 1 else [axes]
for i, year in enumerate(years_to_plot):
ax = axes[i]
# סינון לפי שנת תאונה
df_year = accdata[(accdata['SHNAT_TEUNA_x'] == year) &
(accdata['SHNAT_YITZUR'] != 0) &
accdata['SHNAT_YITZUR'].notna() &
accdata['SUG_REHEV_LMS'].notna()]
# קיבוץ וספירה
pivot_data = df_year.pivot_table(index='SHNAT_YITZUR',
columns='SUG_REHEV_LMS',
values='pk_teuna_fikt',
aggfunc='count',
fill_value=0)
pivot_data = pivot_data.sort_index()
top_vehicles = pivot_data.sum().sort_values(ascending=False).head(10).index
pivot_data_top = pivot_data[top_vehicles]
pivot_data_top = pivot_data_top.loc[~(pivot_data_top == 0).all(axis=1)]
pivot_data_top = pivot_data_top.loc[pivot_data_top.index >= 1996]
# ציור גרף מקונן
pivot_data_top.plot(kind='bar', stacked=True, ax=ax, colormap='tab20')
ax.set_xticks(np.arange(len(pivot_data_top.index)))
ax.set_xticklabels([int(year) for year in pivot_data_top.index])
# כותרות
ax.set_title(f"{reshape_hebrew('שנת תאונה')}: {year}", fontsize=14)
ax.set_xlabel(reshape_hebrew('שנת ייצור'))
ax.set_ylabel(reshape_hebrew('מספר תאונות'))
ax.grid(axis='y', linestyle='--', alpha=0.7)
ax.legend([],[], frameon=False) # במקרא כללי מתחת
# הסרת צירים ריקים במידה ויש פחות גרפים מ-max_plots
for j in range(len(years_to_plot), len(axes)):
fig.delaxes(axes[j])
# מקרא אחד מרכזי מתחת לכל הגרפים
handles, labels = axes[0].get_legend_handles_labels()
new_labels = [reshape_hebrew(label) for label in labels]
fig.legend(handles, new_labels, title=reshape_hebrew('סוג רכב'), loc='lower center', ncol=5)
plt.tight_layout(rect=[0, 0.2, 1, 1])
plt.show()
🧠 מה אפשר להסיק מהגרף?¶
- הכלים החדשים מעורבים יותר בתאונות
ברוב שנות התאונה (2021–2023), רואים שמרבית כלי הרכב המעורבים בתאונות יוצרו בעשור האחרון (2010 ואילך), ובעיקר בשנים האחרונות (2016–2021).
- זה טבעי, כי רוב הרכבים שנמצאים על הכביש כיום הם רכבים חדשים יחסית.
- שכיחות גבוהה לרכב פרטי
הצבע הכחול (רכב נוסעים פרטי) שולט ברוב העמודות, כלומר רוב התאונות כוללות רכבים פרטיים.
- זה תואם את שיעור הרכבים הפרטיים בצי הרכב הכללי.
- מספר תאונות כולל – מגמה יציבה או עולה
- ניתן לראות שב-2022 ובמיוחד ב-2023 יש ירידה במספר כלי הרכב המעורבים בתאונות דרכים קלות לעומת 2021, בעיקר בקרב רכבים שיוצרו ב-2016 ואילך.
- נוכחות גבוהה של רכבים ישנים (לפני 2005) – כמעט לא קיימת
- רכבים שיוצרו לפני 2005 נדירים יחסית בתאונות, מה שכנראה מעיד על כך שרובם כבר לא בשימוש.
- סוגי רכבים מיוחדים (אוטובוסים, משאיות כבדות, אופנועים) – נוכחות מצומצמת אך עקבית
מופיעים פחות, אך ניתן לראות שכבות דקות שלהם, בעיקר בשנים האחרונות.
- ייתכן שתחבורה מקצועית/ציבורית גם משפיעה אך לא בהיקפים כמו רכב פרטי.
🔎 מסקנות כלליות:¶
רוב הרכבים המעורבים בתאונות הם בני פחות מ-10 שנים.
רכב פרטי הוא הסוג הדומיננטי בתאונות.
תאונות עם רכבים ישנים נדירות – אולי עקב ירידה בכמותם על הכביש.
🔹 האם יש קשר בין סוג הרכב לאזור גאוגרפי של התאונה?¶
# סינון נתונים עם קואורדינטות תקינות
df = accdata.copy()
df = df.dropna(subset=['X', 'Y', 'SUG_REHEV_LMS', 'SUG_TEUNA_HE', 'SHNAT_TEUNA_y'])
df = df[(df['X'] > 100000) & (df['X'] < 300000) & (df['Y'] > 500000) & (df['Y'] < 800000)]
# המרת קואורדינטות מ־EPSG:2039 ל־EPSG:4326
transformer = Transformer.from_crs("EPSG:2039", "EPSG:4326", always_xy=True)
df['lon'], df['lat'] = transformer.transform(df['X'].values, df['Y'].values)
# דגימה כדי למנוע עומס (אפשר להגדיל/להקטין לפי הצורך)
df_sample = df.sample(n=min(2000, len(df)), random_state=42)
# יצירת מפה בסיסית
m = folium.Map(location=[31.7683, 35.2137], zoom_start=8)
# מיפוי צבעים לפי סוג רכב
unique_vehicles = df_sample['SUG_REHEV_LMS'].unique()
colormap = matplotlib.colormaps.get_cmap('tab20')
color_dict = {veh: mcolors.to_hex(colormap(i % 20)) for i, veh in enumerate(unique_vehicles)}
# לולאה על השנים להצגת שכבות נפרדות
for year in sorted(df_sample['SHNAT_TEUNA_y'].unique()):
# יצירת FeatureGroup לשנה
fg = folium.FeatureGroup(name=f"שנה {int(year)}", show=True)
# סינון הנתונים לאותה שנה
df_year = df_sample[df_sample['SHNAT_TEUNA_y'] == year]
# יצירת MarkerCluster בתוך ה-FeatureGroup
marker_cluster = MarkerCluster().add_to(fg)
# הוספת נקודות
for _, row in df_year.iterrows():
folium.CircleMarker(
location=[row['lat'], row['lon']],
radius=4,
color=color_dict[row['SUG_REHEV_LMS']],
fill=True,
fill_color=color_dict[row['SUG_REHEV_LMS']],
fill_opacity=0.7,
popup=folium.Popup(
f"""<div dir='rtl'>
סוג רכב: {row['SUG_REHEV_LMS']}<br>
שנה: {int(row['SHNAT_TEUNA_y'])}<br>
סוג תאונה: {reshape_hebrew(row['SUG_TEUNA_HE'])}
</div>""",
max_width=300
)
).add_to(marker_cluster)
# הוספת HeatMap
heat_data = df_year[['lat', 'lon']].values.tolist()
HeatMap(heat_data, radius=8, blur=15).add_to(fg)
# הוספת ה-FeatureGroup למפה
fg.add_to(m)
# הוספת מקרא צבעים
legend_html = '''
<div style="position: fixed; bottom: 50px; left: 50px; z-index:9999; background-color:white; padding: 10px; border:2px solid grey;">
<b>מקרא: סוג רכב</b><br>
''' + ''.join([f'<div style="display:inline-block; width:10px; height:10px; background:{color_dict[veh]}; margin-right:5px;"></div> {veh}<br>' for veh in unique_vehicles]) + '</div>'
m.get_root().html.add_child(folium.Element(legend_html))
# הוספת בורר שכבות להפעלה וכיבוי של שנים
folium.LayerControl(collapsed=False).add_to(m)
# הצגת המפה
m
✅ מסקנה:¶
מהמפה ניתן לראות כי באזורים מרכזיים וצפופים (כגון תל אביב, ירושלים וחיפה) מספר כלי הרכב המעורבים בתאונות הוא גבוה יותר, ככל הנראה בשל עומסי תנועה, ריכוז אוכלוסייה גבוה, ושכיחות גבוהה יותר של כלי רכב.
עם זאת, לא ניתן להבחין ב־מגמה ברורה או קשר חד־משמעי בין סוג הרכב לבין המיקום הגאוגרפי של התאונה – ייתכן שנדרשת חקירה מעמיקה יותר תוך שילוב משתנים נוספים כמו שעות, סוגי דרכים, ותנאי דרך.
def fix_hebrew_plot_labels(ax):
ticks = ax.get_yticks()
ax.set_yticks(ticks)
ax.set_yticklabels([f"{int(tick * 100)}%" for tick in ticks])
# תיקון כותרת
if ax.title.get_text():
ax.set_title(reshape_hebrew(ax.title.get_text()))
# תיקון תוויות צירים
if ax.get_xlabel():
ax.set_xlabel(reshape_hebrew(ax.get_xlabel()))
if ax.get_ylabel():
ax.set_ylabel(reshape_hebrew(ax.get_ylabel()))
# תיקון טיקים בציר X
xlabels = [reshape_hebrew(t.get_text()) for t in ax.get_xticklabels()]
ax.set_xticklabels(xlabels, rotation=45)
# תיקון טיקים בציר Y (אם רוצים)
ylabels = [reshape_hebrew(t.get_text()) for t in ax.get_yticklabels()]
ax.set_yticklabels(ylabels)
# תיקון תוויות מקרא (legend)
leg = ax.get_legend()
if leg:
for text in leg.get_texts():
text.set_text(reshape_hebrew(text.get_text()))
# אם יש כותרת למקרא, גם לה לעבד
if leg.get_title():
leg.set_title(reshape_hebrew(leg.get_title().get_text()))
שכיחויות של סוגי תאונה לפי סוג כביש¶
# טבלת שכיחויות של סוגי תאונה לפי סוג כביש
cross_tab = pd.crosstab(accdata['SUG_DEREH'], accdata['SUG_TEUNA'])
#print(cross_tab)
# גרף עמודות מצטבר להצגת התפלגות
cross_tab_norm = cross_tab.div(cross_tab.sum(axis=1), axis=0) # אחוזים לכל סוג כביש
ax = cross_tab_norm.plot(kind='bar', stacked=True, figsize=(14,7), colormap='tab20')
plt.title('התפלגות סוגי תאונות לפי סוג כביש')
plt.xlabel('סוג כביש')
plt.ylabel('אחוז התאונות')
plt.legend(title='סוג תאונה', bbox_to_anchor=(1.05, 1), loc='upper left')
fix_hebrew_plot_labels(ax)
plt.tight_layout()
plt.show()
✅ מסקנה:¶
מהניתוח עולה כי קיימת התפלגות שונה של סוגי תאונות בהתאם ל־סוג הדרך:
- ב־כבישים עירוניים נפוצות יותר התנגשויות בין כלי רכב, תאונות עם הולכי רגל, ופגיעות כתוצאה מחוסר זהירות בשטח צפוף.
- ב־כבישים בינעירוניים נרשמות יותר תאונות חזית־אחור – לעיתים עקב מהירות גבוהה, עייפות או הסחות דעת.
📌 השלכות:¶
- 🚧 יש להתאים את אמצעי הבטיחות והתשתיות לאופי התאונות בכל סוג כביש:
- בעיר: שיפור מעברי חצייה, רמזורים חכמים, הגבלת מהירות.
- בינעירוני: שילוט ברור, פסי האטה לפני פניות מסוכנות, מצלמות מהירות.
- 🛑 קמפיינים ממוקדים להגברת מודעות לנהיגה בטוחה לפי סוג הכביש
🔹 איזה ימים בשבוע מסוכנים יותר?¶
# עיבוד רק על הערכים הייחודיים בעמודות, ולא על כל השורות
unique_yom = accdata['YOM_BASHAVUA'].dropna().unique()
reshaped_yom = {val: reshape_hebrew(val) for val in unique_yom}
accdata['YOM_BASHAVUA'] = accdata['YOM_BASHAVUA'].map(reshaped_yom).fillna(accdata['YOM_BASHAVUA'])
unique_yehida = accdata['YEHIDA'].dropna().unique()
reshaped_yehida = {val: reshape_hebrew(val) for val in unique_yehida}
accdata['YEHIDA'] = accdata['YEHIDA'].map(reshaped_yehida).fillna(accdata['YEHIDA'])
# המרת השנה למחרוזת (לשימוש ב־facet)
accdata['SHNAT_TEUNA_x'] = accdata['SHNAT_TEUNA_x'].astype(str)
# יצירת הדוח המורחב - ספירת תאונות לפי שנה, יום בשבוע ויחידה
report = accdata.groupby(['SHNAT_TEUNA_x', 'YOM_BASHAVUA', 'YEHIDA']).size().reset_index(name='מספר תאונות')
# ניצור FacetGrid עם heatmap נפרד לכל שנה
for year in report['SHNAT_TEUNA_x'].unique():
subset = report[report['SHNAT_TEUNA_x'] == year]
pivot_report = subset.pivot(index=reshape_hebrew('YOM_BASHAVUA'), columns='YEHIDA', values='מספר תאונות').fillna(0)
plt.figure(figsize=(12, 6))
sns.heatmap(pivot_report, annot=True, fmt=".0f", cmap="YlGnBu")
plt.title(reshape_hebrew(f"מספר תאונות לפי יום בשבוע ויחידה - שנה {year}"))
plt.xlabel(reshape_hebrew("יחידה"))
plt.ylabel(reshape_hebrew("יום בשבוע"))
plt.yticks(rotation=0)
plt.tight_layout()
plt.show()
🔹 איזה יחידות משטרה לפי מחוז מתמודדות עם עומס תאונות גבוה?¶
plt.figure(figsize=(12, 6))
sns.countplot(data=accdata, x='YEHIDA', order=accdata['YEHIDA'].value_counts().index, palette='Spectral',hue=reshape_hebrew('YEHIDA'),legend=False )
plt.title(reshape_hebrew("מספר תאונות לפי מרחב"))
plt.xlabel(reshape_hebrew("מרחב"))
plt.ylabel(reshape_hebrew("מספר תאונות"))
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
plt.figure(figsize=(14, 8))
# מציאת 10 סוגי התאונות הכי נפוצים
top_10_teuna_types = accdata['SUG_TEUNA_HE'].value_counts().head(10).index
# סינון הנתונים רק לסוגי התאונות הנפוצים
filtered_data = accdata[accdata['SUG_TEUNA_HE'].isin(top_10_teuna_types)]
# יצירת crosstab
cross_tab = pd.crosstab(filtered_data['YEHIDA'], filtered_data['SUG_TEUNA_HE'])
# סידור היחידות לפי סך התאונות
yehida_order = filtered_data['YEHIDA'].value_counts().index
cross_tab_ordered = cross_tab.loc[yehida_order]
# סידור סוגי התאונות לפי תכיפות
teuna_order = filtered_data['SUG_TEUNA_HE'].value_counts().index
cross_tab_ordered = cross_tab_ordered[teuna_order]
# יצירת גרף מוערם
ax = cross_tab_ordered.plot(kind='bar', stacked=True, figsize=(14, 8),
colormap='Set1', width=0.8)
plt.title(reshape_hebrew("התפלגות עשרת סוגי התאונות הנפוצים ביותר לפי יחידה"), fontsize=16)
plt.xlabel(reshape_hebrew("יחידה"), fontsize=12)
plt.ylabel(reshape_hebrew("מספר תאונות"), fontsize=12)
plt.xticks(rotation=45, ha='right')
plt.legend(title=reshape_hebrew("סוג תאונה"), bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
plt.show()
<Figure size 1400x800 with 0 Axes>
pivot_report = accdata.groupby(['YOM_BASHAVUA', 'YEHIDA']).size().unstack(fill_value=0)
pivot_report
# עיבוד אינדקס (שורות)
pivot_report.index = pivot_report.index.map(reshape_hebrew)
# עיבוד עמודות (אם הן קטגוריות בעברית)
pivot_report.columns = pivot_report.columns.map(reshape_hebrew)
# הצגה
pivot_report
| YEHIDA | מרחב שמשון (החל ב-2004) | מרחב חוף (חיפה) | מרחב ת"א | מרחב הנגב | מרחב יהודה | מרחב השפלה | מרחב גליל | מחוז ירושלים | מרחב עמקים | מרחב שומרון | מרחב השרון | מרחב לכיש | מרחב אילת |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| YOM_BASHAVUA | |||||||||||||
| שני | 0 | 928 | 3827 | 1247 | 314 | 2534 | 4494 | 1776 | 1437 | 183 | 2387 | 1781 | 104 |
| רביעי | 0 | 980 | 3625 | 1183 | 334 | 2469 | 4361 | 1605 | 1395 | 192 | 2355 | 1780 | 113 |
| שלישי | 1 | 1007 | 3630 | 1205 | 336 | 2484 | 4419 | 1639 | 1393 | 207 | 2416 | 1819 | 108 |
| חמישי | 0 | 1004 | 3778 | 1372 | 379 | 2616 | 4644 | 1778 | 1478 | 176 | 2611 | 1922 | 126 |
| שישי | 0 | 695 | 2266 | 793 | 233 | 1568 | 3679 | 986 | 1110 | 120 | 1608 | 1147 | 94 |
| ראשון | 0 | 969 | 3828 | 1373 | 346 | 2732 | 4583 | 1763 | 1363 | 177 | 2590 | 1956 | 107 |
| שבת | 1 | 376 | 1225 | 456 | 165 | 821 | 3117 | 681 | 894 | 80 | 973 | 562 | 65 |
✅ מסקנה:¶
מהנתונים עולה כי מרחב הגליל ו־מרחב תל אביב הם היחידות עם היקף התאונות הגבוה ביותר.
עוד עולה כי עומס התאונות מתרכז בעיקר בימי חמישי ו־ראשון, בככל המחוזות, ככל הנראה בשל התנועה הרבה המתקיימת בימים אלו. בנוסף לכך, מהנתונים עולה כי בימי שישי ושבת ישנה ירידה בכמות התאונות בהשוואה לשאר ימות השבוע.
📌 השלכות:¶
- 🚓 יש לחזק את הנוכחות המשטרתית והאכיפה במרחבים אלה, במיוחד בימים מועדים לתאונות.
- 📆 רצוי לבצע קמפיינים ממוקדים להעלאת מודעות בקרב נהגים לפני ואחרי סוף שבוע.
🔹 איך מתפלגות התאונות לאורך השנים והאם יש הבדל בין יום/לילה לבין כמות וסוג התאונות?¶
plt.figure(figsize=(10, 5))
sns.countplot(data=accdata, x=reshape_hebrew('SHNAT_TEUNA_x'), palette='Set2',legend=False,hue='SHNAT_TEUNA_x')
plt.title(reshape_hebrew("מספר תאונות לפי שנה"))
plt.xlabel(reshape_hebrew("שנה"))
plt.ylabel(reshape_hebrew("מספר תאונות"))
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# עיצוב גרפים
sns.set(style="whitegrid", font="Arial")
plt.rcParams['axes.unicode_minus'] = False
# עיבוד טקסטים לצירים וכותרות
xlabel = reshape_hebrew("סוג תאונה")
ylabel = reshape_hebrew("מספר תאונות")
title = reshape_hebrew("התפלגות סוגי תאונות לפי יום/לילה")
legend_title = reshape_hebrew("יום/לילה")
# מיפוי טקסטים בעברית לעמודות
accdata = accdata[accdata['SUG_TEUNA'].notna() & accdata['YOM_LAYLA'].notna()].copy()
# מיפוי עברית יעיל לעמודת SUG_TEUNA
sug_teuna_map = {val: reshape_hebrew(val) for val in accdata['SUG_TEUNA'].unique()}
accdata['SUG_TEUNA_HE'] = accdata['SUG_TEUNA'].map(sug_teuna_map)
# מיפוי עברית לעמודת YOM_LAYLA
yom_layla_map = {val: reshape_hebrew(val) for val in accdata['YOM_LAYLA'].unique()}
accdata['YOM_LAYLA_HE'] = accdata['YOM_LAYLA'].map(yom_layla_map)
# ציור הגרף
plt.figure(figsize=(12, 6))
sns.countplot(data=accdata, x='SUG_TEUNA_HE', hue='YOM_LAYLA_HE', palette='Set2', order=accdata['SUG_TEUNA_HE'].value_counts().index)
plt.xlabel(xlabel)
plt.ylabel(ylabel)
plt.title(title)
plt.legend(title=legend_title)
plt.xticks(rotation=80)
plt.tight_layout()
plt.show()
def detailed_day_night_comparison1(accdata):
"""
השוואה מפורטת בין תאונות יום ולילה
"""
# בדיקת התפלגות בסיסית
day_night_counts = accdata['YOM_LAYLA'].value_counts()
day_night_pct = accdata['YOM_LAYLA'].value_counts(normalize=True) * 100
for condition in day_night_counts.index:
condition_fixed = (condition)
count = day_night_counts[condition]
pct = day_night_pct[condition]
# גרפים השוואתיים
fig, axes = plt.subplots(2, 2, figsize=(15, 12))
# גרף 1: התפלגות בסיסית
day_night_pct_reshaped = day_night_pct.rename(index=reshape_hebrew)
day_night_pct_reshaped.plot(kind='pie', ax=axes[0, 0], autopct='%1.1f%%',
colors=['gold', 'navy'] if len(day_night_pct) == 2 else None)
axes[0, 0].set_title(reshape_hebrew('התפלגות כללית: יום מול לילה'))
axes[0, 0].set_ylabel('')
# גרף 2: התפלגות לפי שעות
hourly_breakdown = accdata.groupby(['SHAA_CLEAN', 'YOM_LAYLA']).size().unstack(fill_value=0)
hourly_breakdown.columns = [reshape_hebrew(col) for col in hourly_breakdown.columns]
hourly_breakdown.plot(kind='bar', ax=axes[0, 1],
color=['gold', 'navy'] if hourly_breakdown.shape[1] == 2 else None)
axes[0, 1].set_title(reshape_hebrew('התפלגות לפי שעות'))
axes[0, 1].set_xlabel(reshape_hebrew('שעה'))
axes[0, 1].tick_params(axis='x', rotation=45)
# גרף 3: ימי השבוע
weekly_breakdown = accdata.groupby(['YOM_BASHAVUA', 'YOM_LAYLA']).size().unstack(fill_value=0)
weekly_breakdown.index = [(i) for i in weekly_breakdown.index]
weekly_breakdown.columns = [reshape_hebrew(col) for col in weekly_breakdown.columns]
weekly_breakdown.plot(kind='bar', ax=axes[1, 0],
color=['gold', 'navy'] if weekly_breakdown.shape[1] == 2 else None)
axes[1, 0].set_title(reshape_hebrew('התפלגות לפי ימי השבוע'))
axes[1, 0].tick_params(axis='x', rotation=45)
# גרף 4: סוגי תאונות
accident_types_breakdown = accdata.groupby(['SUG_TEUNA', 'YOM_LAYLA']).size().unstack(fill_value=0)
top_accidents = accident_types_breakdown.sum(axis=1).nlargest(8).index
sub_df = accident_types_breakdown.loc[top_accidents]
sub_df.index = [reshape_hebrew(i) for i in sub_df.index]
sub_df.columns = [reshape_hebrew(col) for col in sub_df.columns]
sub_df.plot(kind='bar', ax=axes[1, 1],
color=['gold', 'navy'] if sub_df.shape[1] == 2 else None)
axes[1, 1].set_title(reshape_hebrew('סוגי תאונות מובילים'))
axes[1, 1].tick_params(axis='x', rotation=45)
def balanced_day_night_analysis(accdata):
"""
ניתוח מאוזן ומלא של יום ולילה
"""
print("☀️🌙 ניתוח מאוזן: יום ולילה")
print("=" * 40)
# חלוקה לשני דטא-סטים
day_data = accdata[accdata['YOM_LAYLA'] == 'יום'].copy()
night_data = accdata[accdata['YOM_LAYLA'] == 'לילה'].copy()
print(f"📊 נתונים בסיסיים:")
print(f"תאונות יום: {len(day_data):,} (75.0%)")
print(f"תאונות לילה: {len(night_data):,} (25.0%)")
print(f"יחס יום/לילה: {len(day_data)/len(night_data):.1f}:1")
return day_data, night_data
def analyze_day_specific_patterns(day_data):
"""
ניתוח דפוסים ייחודיים לתאונות יום
"""
print("\n☀️ דפוסים ייחודיים לתאונות יום")
print("=" * 45)
# 1. שעות העומס ביום
day_hourly = day_data.groupby('SHAA_CLEAN').agg({
'pk_teuna_fikt': 'count',
'SUG_TEUNA': lambda x: x.mode().iloc[0] if len(x.mode()) > 0 else 'מעורב',
'SUG_REHEV_LMS': lambda x: x.mode().iloc[0] if len(x.mode()) > 0 else 'מעורב'
})
day_hourly.columns = ['תאונות', 'סוג_תאונה_נפוץ', 'רכב_נפוץ']
day_hourly = day_hourly.sort_values('תאונות', ascending=False)
print("🕐 השעות המסוכנות ביותר ביום:")
print(day_hourly.head(10))
# זיהוי שעות עומס ושעות רגילות
rush_hours = [7, 8, 16, 17, 18]
rush_accidents = day_data[day_data['SHAA_CLEAN'].isin(rush_hours)]
non_rush_accidents = day_data[~day_data['SHAA_CLEAN'].isin(rush_hours)]
print(f"\n🚦 תאונות בשעות עומס: {len(rush_accidents):,} ({len(rush_accidents)/len(day_data)*100:.1f}%)")
print(f"⏰ תאונות בשעות רגילות: {len(non_rush_accidents):,} ({len(non_rush_accidents)/len(day_data)*100:.1f}%)")
# ניתוח סוגי תאונות בשעות עומס
rush_accident_types = rush_accidents['SUG_TEUNA'].value_counts().head(8)
print(f"\n🚗 סוגי תאונות נפוצים בשעות עומס:")
for i, (accident_type, count) in enumerate(rush_accident_types.items(), 1):
pct = (count / len(rush_accidents)) * 100
print(f"{i:2}. {accident_type}: {count:,} ({pct:.1f}%)")
# ניתוח רכבים מעורבים ביום
day_vehicles = day_data['SUG_REHEV_LMS'].value_counts().head(10)
print(f"\n🚙 רכבים מעורבים ביותר בתאונות יום:")
for i, (vehicle, count) in enumerate(day_vehicles.items(), 1):
pct = (count / len(day_data)) * 100
print(f"{i:2}. {vehicle}: {count:,} ({pct:.1f}%)")
return day_hourly, rush_accidents, non_rush_accidents
def analyze_night_specific_patterns(night_data):
"""
ניתוח דפוסים ייחודיים לתאונות לילה
"""
print("\n🌙 דפוסים ייחודיים לתאונות לילה")
print("=" * 50)
# שעות לילה מסוכנות
night_hourly = night_data.groupby('SHAA_CLEAN').agg({
'pk_teuna_fikt': 'count',
'SUG_TEUNA': lambda x: x.mode().iloc[0] if len(x.mode()) > 0 else 'מעורב',
'SUG_REHEV_LMS': lambda x: x.mode().iloc[0] if len(x.mode()) > 0 else 'מעורב'
})
night_hourly.columns = ['תאונות', 'סוג_תאונה_נפוץ', 'רכב_נפוץ']
night_hourly = night_hourly.sort_values('תאונות', ascending=False)
print("🕐 השעות המסוכנות ביותר בלילה:")
print(night_hourly.head(10))
# זיהוי שעות מתות (02:00-05:00)
dead_hours = [2, 3, 4, 5]
dead_hour_accidents = night_data[night_data['SHAA_CLEAN'].isin(dead_hours)]
print(f"\n💀 תאונות ב'שעות המתות' (02:00-05:00): {len(dead_hour_accidents):,}")
print(f" זה {len(dead_hour_accidents)/len(night_data)*100:.1f}% מתאונות הלילה")
# ניתוח סוגי תאונות בלילה
night_accident_types = night_data['SUG_TEUNA'].value_counts().head(8)
print(f"\n🌑 סוגי תאונות נפוצים בלילה:")
for i, (accident_type, count) in enumerate(night_accident_types.items(), 1):
pct = (count / len(night_data)) * 100
print(f"{i:2}. {accident_type}: {count:,} ({pct:.1f}%)")
# ניתוח רכבים מעורבים בלילה
night_vehicles = night_data['SUG_REHEV_LMS'].value_counts().head(10)
print(f"\n🏍️ רכבים מעורבים ביותר בתאונות לילה:")
for i, (vehicle, count) in enumerate(night_vehicles.items(), 1):
pct = (count / len(night_data)) * 100
print(f"{i:2}. {vehicle}: {count:,} ({pct:.1f}%)")
return night_hourly, dead_hour_accidents
def compare_day_vs_night_patterns(day_data, night_data):
"""
השוואה ישירה בין דפוסי יום ולילה
"""
print("\n⚖️ השוואה ישירה: יום מול לילה")
print("=" * 45)
# 1. השוואת סוגי תאונות
day_accidents = day_data['SUG_TEUNA'].value_counts(normalize=True) * 100
night_accidents = night_data['SUG_TEUNA'].value_counts(normalize=True) * 100
accident_comparison = pd.DataFrame({
'יום_אחוז': day_accidents,
'לילה_אחוז': night_accidents
}).fillna(0)
accident_comparison['הפרש_לילה_מינוס_יום'] = accident_comparison['לילה_אחוז'] - accident_comparison['יום_אחוז']
accident_comparison = accident_comparison.sort_values('הפרש_לילה_מינוס_יום', ascending=False)
print("🔍 סוגי תאונות שנפוצים יותר בלילה מאשר ביום:")
night_dominant = accident_comparison[accident_comparison['הפרש_לילה_מינוס_יום'] > 1].head(5)
for accident_type, row in night_dominant.iterrows():
print(f" • {accident_type}:")
print(f" לילה: {row['לילה_אחוז']:.1f}% | יום: {row['יום_אחוז']:.1f}% | הפרש: +{row['הפרש_לילה_מינוס_יום']:.1f}%")
print("\n🔍 סוגי תאונות שנפוצים יותר ביום מאשר בלילה:")
day_dominant = accident_comparison[accident_comparison['הפרש_לילה_מינוס_יום'] < -1].tail(5)
for accident_type, row in day_dominant.iterrows():
print(f" • {accident_type}:")
print(f" יום: {row['יום_אחוז']:.1f}% | לילה: {row['לילה_אחוז']:.1f}% | הפרש: {row['הפרש_לילה_מינוס_יום']:.1f}%")
# 2. השוואת רכבים
day_vehicles = day_data['SUG_REHEV_LMS'].value_counts(normalize=True) * 100
night_vehicles = night_data['SUG_REHEV_LMS'].value_counts(normalize=True) * 100
vehicle_comparison = pd.DataFrame({
'יום_אחוז': day_vehicles,
'לילה_אחוז': night_vehicles
}).fillna(0)
vehicle_comparison['הפרש_לילה_מינוס_יום'] = vehicle_comparison['לילה_אחוז'] - vehicle_comparison['יום_אחוז']
vehicle_comparison = vehicle_comparison.sort_values('הפרש_לילה_מינוס_יום', ascending=False)
print("\n🏍️ רכבים שמעורבים יותר בלילה:")
night_vehicles_dominant = vehicle_comparison[vehicle_comparison['הפרש_לילה_מינוס_יום'] > 0.5].head(5)
for vehicle, row in night_vehicles_dominant.iterrows():
print(f" • {vehicle}:")
print(f" לילה: {row['לילה_אחוז']:.1f}% | יום: {row['יום_אחוז']:.1f}% | הפרש: +{row['הפרש_לילה_מינוס_יום']:.1f}%")
print("\n🚗 רכבים שמעורבים יותר ביום:")
day_vehicles_dominant = vehicle_comparison[vehicle_comparison['הפרש_לילה_מינוס_יום'] < -0.5].tail(5)
for vehicle, row in day_vehicles_dominant.iterrows():
print(f" • {vehicle}:")
print(f" יום: {row['יום_אחוז']:.1f}% | לילה: {row['לילה_אחוז']:.1f}% | הפרש: {row['הפרש_לילה_מינוס_יום']:.1f}%")
# 3. השוואת יחידות משטרה
day_units = day_data[reshape_hebrew('YEHIDA')].value_counts()
night_units = night_data[reshape_hebrew('YEHIDA')].value_counts()
units_comparison = pd.DataFrame({
'יום': day_units,
'לילה': night_units
}).fillna(0)
units_comparison['סך_הכל'] = units_comparison.sum(axis=1)
units_comparison['אחוז_לילה'] = (units_comparison['לילה'] / units_comparison['סך_הכל'] * 100).round(1)
units_comparison = units_comparison.sort_values('אחוז_לילה', ascending=False)
print(f"\n👮 יחידות משטרה עם אחוז תאונות לילה גבוה:")
for unit, row in units_comparison.head(5).iterrows():
print(f" • {reshape_hebrew(unit)}: {row['אחוז_לילה']:.1f}% לילה ({row['לילה']:.0f} מתוך {row['סך_הכל']:.0f})")
print(f"\n👮 יחידות משטרה עם אחוז תאונות יום גבוה:")
for unit, row in units_comparison.tail(5).iterrows():
day_pct = 100 - row['אחוז_לילה']
print(f" • {reshape_hebrew(unit)}: {day_pct:.1f}% יום ({row['יום']:.0f} מתוך {row['סך_הכל']:.0f})")
return accident_comparison, vehicle_comparison, units_comparison
def create_comprehensive_visualizations(day_data, night_data):
"""
יצירת גרפים מקיפים להשוואת יום ולילה
"""
print("\n📊 יוצר גרפים השוואתיים מקיפים...")
fig, axes = plt.subplots(3, 2, figsize=(20, 18))
# גרף 1: התפלגות שעות - יום
day_hourly = day_data.groupby('SHAA_CLEAN').size()
day_hourly.plot(kind='bar', ax=axes[0,0], color='gold', alpha=0.8)
axes[0,0].set_title(reshape_hebrew('תאונות יום לפי שעה'), fontsize=14, fontweight='bold')
axes[0,0].set_xlabel(reshape_hebrew('שעה'))
axes[0,0].set_ylabel(reshape_hebrew('מספר תאונות'))
axes[0,0].tick_params(axis='x', rotation=45)
# גרף 2: התפלגות שעות - לילה
night_hourly = night_data.groupby('SHAA_CLEAN').size()
night_hourly.plot(kind='bar', ax=axes[0,1], color='navy', alpha=0.8)
axes[0,1].set_title(reshape_hebrew('תאונות לילה לפי שעה'), fontsize=14, fontweight='bold')
axes[0,1].set_xlabel(reshape_hebrew('שעה'))
axes[0,1].set_ylabel(reshape_hebrew('מספר תאונות'))
axes[0,1].tick_params(axis='x', rotation=45)
# גרף 3: סוגי תאונות מובילים - יום
day_accidents = day_data['SUG_TEUNA'].value_counts().head(8)
day_accidents.index = day_accidents.index.map(reshape_hebrew) # ← עיבוד עברית
day_accidents.plot(kind='barh', ax=axes[1,0], color='orange', alpha=0.8)
axes[1,0].set_title(reshape_hebrew('סוגי תאונות מובילים - יום'), fontsize=14, fontweight='bold')
axes[1,0].set_xlabel(reshape_hebrew('מספר תאונות'))
# גרף 4: סוגי תאונות מובילים - לילה
night_accidents = night_data['SUG_TEUNA'].value_counts().head(8)
night_accidents.index = night_accidents.index.map(reshape_hebrew) # ← עיבוד עברית
night_accidents.plot(kind='barh', ax=axes[1,1], color='purple', alpha=0.8)
axes[1,1].set_title(reshape_hebrew('סוגי תאונות מובילים - לילה'), fontsize=14, fontweight='bold')
axes[1,1].set_xlabel(reshape_hebrew('מספר תאונות'))
# גרף 5: רכבים מעורבים - יום
day_vehicles = day_data['SUG_REHEV_LMS'].value_counts().head(8)
day_vehicles.index = day_vehicles.index.map(reshape_hebrew)
day_vehicles.plot(kind='pie', ax=axes[2,0], autopct='%1.1f%%')
axes[2,0].set_title(reshape_hebrew('רכבים מעורבים - יום'), fontsize=14, fontweight='bold')
axes[2,0].set_ylabel('')
# גרף 6: רכבים מעורבים - לילה
night_vehicles = night_data['SUG_REHEV_LMS'].value_counts().head(8)
night_vehicles.index = night_vehicles.index.map(reshape_hebrew)
night_vehicles.plot(kind='pie', ax=axes[2,1], autopct='%1.1f%%')
axes[2,1].set_title(reshape_hebrew('רכבים מעורבים - לילה'), fontsize=14, fontweight='bold')
axes[2,1].set_ylabel('')
plt.tight_layout()
plt.show()
detailed_day_night_comparison1(accdata)
def day_specific_insights(day_data, night_data):
"""
תובנות ספציפיות לתאונות יום
"""
print("\n☀️ תובנות ספציפיות לתאונות יום")
print("=" * 45)
# תאונות עומס vs רגילות
rush_hours = [7, 8, 16, 17, 18]
rush_day = day_data[day_data['SHAA_CLEAN'].isin(rush_hours)]
normal_day = day_data[~day_data['SHAA_CLEAN'].isin(rush_hours)]
print(f"📈 ניתוח שעות עומס ביום:")
print(f" • שעות עומס (7-8, 16-18): {len(rush_day):,} תאונות")
print(f" • שעות רגילות: {len(normal_day):,} תאונות")
print(f" • יחס עומס/רגיל: {len(rush_day)/len(normal_day):.2f}")
# השוואת צפיפות תאונות
rush_hours_count = len(rush_hours)
normal_hours_count = 24 - rush_hours_count - len([h for h in range(24) if h >= 22 or h <= 6]) # לא כולל לילה
rush_density = len(rush_day) / rush_hours_count
normal_density = len(normal_day) / normal_hours_count if normal_hours_count > 0 else 0
print(f" • צפיפות תאונות בשעת עומס: {rush_density:.0f} תאונות/שעה")
print(f" • צפיפות תאונות בשעה רגילה: {normal_density:.0f} תאונות/שעה")
print(f" • גורם כפל סיכון בעומס: x{rush_density/normal_density:.1f}")
# מה מיוחד בתאונות יום מול לילה?
print(f"\n🔍 מה מייחד תאונות יום:")
# יחס התנגשויות אחור (טיפוסי לעומס)
day_rear_end = (day_data['SUG_TEUNA'].str.contains('חזית באחור', na=False)).sum()
night_rear_end = (night_data['SUG_TEUNA'].str.contains('חזית באחור', na=False)).sum()
day_rear_pct = day_rear_end / len(day_data) * 100
night_rear_pct = night_rear_end / len(night_data) * 100
print(f" • פגיעות אחור ביום: {day_rear_pct:.1f}% מהתאונות")
print(f" • פגיעות אחור בלילה: {night_rear_pct:.1f}% מהתאונות")
print(f" • יום הוא x{day_rear_pct/night_rear_pct:.1f} יותר מועד לפגיעות אחור")
# רכבים מסחריים ביום
commercial_vehicles = ['אוטובוס', 'משא', 'מונית', 'טרנזיט']
day_commercial = day_data[day_data['SUG_REHEV_LMS'].str.contains('|'.join(commercial_vehicles), na=False)]
night_commercial = night_data[night_data['SUG_REHEV_LMS'].str.contains('|'.join(commercial_vehicles), na=False)]
day_commercial_pct = len(day_commercial) / len(day_data) * 100
night_commercial_pct = len(night_commercial) / len(night_data) * 100
print(f" • רכבים מסחריים ביום: {day_commercial_pct:.1f}% מהתאונות")
print(f" • רכבים מסחריים בלילה: {night_commercial_pct:.1f}% מהתאונות")
print(f" • יום הוא x{day_commercial_pct/night_commercial_pct:.1f} יותר מועד לתאונות מסחריות")
def run_complete_balanced_analysis(accdata):
"""
הרצת ניתוח מאוזן מלא של יום ולילה
"""
print("🚀 מתחיל ניתוח מאוזן מלא: יום ולילה")
print("=" * 55)
# 1. חלוקה בסיסית
day_data, night_data = balanced_day_night_analysis(accdata)
# 2. ניתוח דפוסים ייחודיים ליום
day_patterns = analyze_day_specific_patterns(day_data)
# 3. ניתוח דפוסים ייחודיים ללילה
night_patterns = analyze_night_specific_patterns(night_data)
# 4. השוואה ישירה
comparisons = compare_day_vs_night_patterns(day_data, night_data)
# 5. תובנות ספציפיות ליום
day_specific_insights(day_data, night_data)
# 6. יצירת גרפים
create_comprehensive_visualizations(day_data, night_data)
run_complete_balanced_analysis(accdata)
🚀 מתחיל ניתוח מאוזן מלא: יום ולילה
=======================================================
☀️🌙 ניתוח מאוזן: יום ולילה
========================================
📊 נתונים בסיסיים:
תאונות יום: 97,028 (75.0%)
תאונות לילה: 32,426 (25.0%)
יחס יום/לילה: 3.0:1
☀️ דפוסים ייחודיים לתאונות יום
=============================================
🕐 השעות המסוכנות ביותר ביום:
תאונות סוג_תאונה_נפוץ רכב_נפוץ
SHAA_CLEAN
15 10261 התנגשות חזית באחור רכב נוסעים פרטי
16 10200 התנגשות חזית באחור רכב נוסעים פרטי
14 9459 התנגשות חזית באחור רכב נוסעים פרטי
13 8940 התנגשות חזית באחור רכב נוסעים פרטי
12 8526 התנגשות חזית באחור רכב נוסעים פרטי
8 8465 התנגשות חזית באחור רכב נוסעים פרטי
7 7441 התנגשות חזית באחור רכב נוסעים פרטי
11 7210 התנגשות חזית באחור רכב נוסעים פרטי
10 6637 התנגשות חזית באחור רכב נוסעים פרטי
17 6527 התנגשות חזית באחור רכב נוסעים פרטי
🚦 תאונות בשעות עומס: 36,653 (37.8%)
⏰ תאונות בשעות רגילות: 60,375 (62.2%)
🚗 סוגי תאונות נפוצים בשעות עומס:
1. התנגשות חזית באחור: 18,032 (49.2%)
2. התנגשות צד בצד: 4,312 (11.8%)
3. התנגשות חזית אל צד: 3,275 (8.9%)
4. פגיעה בהולך רגל: 2,885 (7.9%)
5. התנגשות עם עצם דומם: 1,934 (5.3%)
6. החלקה: 1,300 (3.5%)
7. פגיעה בנוסע בתוך כלי רכב: 1,242 (3.4%)
8. אחר: 1,015 (2.8%)
🚙 רכבים מעורבים ביותר בתאונות יום:
1. רכב נוסעים פרטי: 62,900 (64.8%)
2. אחר ולא ידוע: 6,440 (6.6%)
3. אוטובוס: 6,418 (6.6%)
4. אופנוע 126 עד 400 סמ"ק: 2,669 (2.8%)
5. אופנוע 51 עד 125 סמ"ק: 2,514 (2.6%)
6. משא עד 3.5 טון - אחוד (טרנזיט): 2,186 (2.3%)
7. משא 3.6 עד 9.9 טון: 1,754 (1.8%)
8. משא עד 3.5 טון - לא אחוד (טנדר): 1,745 (1.8%)
9. מונית: 1,728 (1.8%)
10. אופנוע 401+ סמ"ק: 1,578 (1.6%)
🌙 דפוסים ייחודיים לתאונות לילה
==================================================
🕐 השעות המסוכנות ביותר בלילה:
תאונות סוג_תאונה_נפוץ רכב_נפוץ
SHAA_CLEAN
20 4922 התנגשות חזית באחור רכב נוסעים פרטי
19 4521 התנגשות חזית באחור רכב נוסעים פרטי
21 3862 התנגשות חזית באחור רכב נוסעים פרטי
18 3351 התנגשות חזית באחור רכב נוסעים פרטי
22 3077 התנגשות חזית באחור רכב נוסעים פרטי
17 2671 התנגשות חזית באחור רכב נוסעים פרטי
23 2525 התנגשות חזית באחור רכב נוסעים פרטי
6 1435 התנגשות חזית באחור רכב נוסעים פרטי
0 1299 התנגשות חזית באחור רכב נוסעים פרטי
5 1175 התנגשות חזית באחור רכב נוסעים פרטי
💀 תאונות ב'שעות המתות' (02:00-05:00): 2,994
זה 9.2% מתאונות הלילה
🌑 סוגי תאונות נפוצים בלילה:
1. התנגשות חזית באחור: 12,352 (38.1%)
2. התנגשות עם עצם דומם: 3,783 (11.7%)
3. התנגשות צד בצד: 3,634 (11.2%)
4. התנגשות חזית אל צד: 3,037 (9.4%)
5. פגיעה בהולך רגל: 2,493 (7.7%)
6. החלקה: 2,059 (6.3%)
7. אחר: 1,006 (3.1%)
8. פגיעה בנוסע בתוך כלי רכב: 994 (3.1%)
🏍️ רכבים מעורבים ביותר בתאונות לילה:
1. רכב נוסעים פרטי: 21,562 (66.5%)
2. אחר ולא ידוע: 2,287 (7.1%)
3. אוטובוס: 1,566 (4.8%)
4. אופנוע 51 עד 125 סמ"ק: 1,255 (3.9%)
5. אופנוע 126 עד 400 סמ"ק: 939 (2.9%)
6. משא עד 3.5 טון - אחוד (טרנזיט): 631 (1.9%)
7. אופנוע 401+ סמ"ק: 600 (1.9%)
8. מונית: 560 (1.7%)
9. אופניים חשמליים: 532 (1.6%)
10. משא עד 3.5 טון - לא אחוד (טנדר): 459 (1.4%)
⚖️ השוואה ישירה: יום מול לילה
=============================================
🔍 סוגי תאונות שנפוצים יותר בלילה מאשר ביום:
• התנגשות עם עצם דומם:
לילה: 11.7% | יום: 5.5% | הפרש: +6.2%
• החלקה:
לילה: 6.3% | יום: 4.0% | הפרש: +2.3%
• התנגשות עם בעל חיים:
לילה: 1.5% | יום: 0.1% | הפרש: +1.4%
🔍 סוגי תאונות שנפוצים יותר ביום מאשר בלילה:
• התנגשות צד בצד:
יום: 12.2% | לילה: 11.2% | הפרש: -1.0%
• התנגשות חזית באחור:
יום: 46.0% | לילה: 38.1% | הפרש: -7.9%
🏍️ רכבים שמעורבים יותר בלילה:
• רכב נוסעים פרטי:
לילה: 66.5% | יום: 64.8% | הפרש: +1.7%
• אופנוע 51 עד 125 סמ"ק:
לילה: 3.9% | יום: 2.6% | הפרש: +1.3%
🚗 רכבים שמעורבים יותר ביום:
• משא 16.0 עד 33.9 טון:
יום: 1.2% | לילה: 0.5% | הפרש: -0.7%
• משא 3.6 עד 9.9 טון:
יום: 1.8% | לילה: 1.1% | הפרש: -0.7%
• אוטובוס:
יום: 6.6% | לילה: 4.8% | הפרש: -1.8%
👮 יחידות משטרה עם אחוז תאונות לילה גבוה:
• מרחב יהודה: 28.5% לילה (600 מתוך 2107)
• מרחב גליל: 27.7% לילה (8120 מתוך 29297)
• מרחב שומרון: 27.0% לילה (306 מתוך 1135)
• מחוז ירושלים: 25.1% לילה (2572 מתוך 10228)
• מרחב השרון: 24.8% לילה (3711 מתוך 14940)
👮 יחידות משטרה עם אחוז תאונות יום גבוה:
• מרחב אילת: 75.9% יום (544 מתוך 717)
• מרחב הנגב: 76.1% יום (5803 מתוך 7629)
• מרחב חוף (חיפה): 77.4% יום (4615 מתוך 5959)
• מרחב לכיש: 78.3% יום (8587 מתוך 10967)
• מרחב שמשון (החל ב-2004): 100.0% יום (2 מתוך 2)
☀️ תובנות ספציפיות לתאונות יום
=============================================
📈 ניתוח שעות עומס ביום:
• שעות עומס (7-8, 16-18): 36,653 תאונות
• שעות רגילות: 60,375 תאונות
• יחס עומס/רגיל: 0.61
• צפיפות תאונות בשעת עומס: 7331 תאונות/שעה
• צפיפות תאונות בשעה רגילה: 6038 תאונות/שעה
• גורם כפל סיכון בעומס: x1.2
🔍 מה מייחד תאונות יום:
• פגיעות אחור ביום: 46.0% מהתאונות
• פגיעות אחור בלילה: 38.1% מהתאונות
• יום הוא x1.2 יותר מועד לפגיעות אחור
• רכבים מסחריים ביום: 17.1% מהתאונות
• רכבים מסחריים בלילה: 12.7% מהתאונות
• יום הוא x1.4 יותר מועד לתאונות מסחריות
📊 יוצר גרפים השוואתיים מקיפים...
📊 ניתוח תאונות דרכים – השוואה בין יום ללילה¶
ניתוח גרפי מקיף של תאונות דרכים בישראל לפי: זמן (יום/לילה), שעות, ימי השבוע וסוג התאונה. הנתונים חושפים תובנות משמעותיות באשר להתנהגות בכבישים.
🔆 1. התפלגות כללית: יום מול לילה¶
- 75% מהתאונות מתרחשות ביום
- 25% מהתאונות מתרחשות בלילה
✅ מסקנה: העומס התחבורתי הגבוה בשעות היום, כולל עבודה, לימודים ותנועה עירונית, תורם לכמות תאונות גבוהה יותר לעומת שעות הלילה.
🕒 2. התפלגות לפי שעות¶
| טווח שעות | תובנות עיקריות |
|---|---|
| 07:00–17:00 | שיא התאונות ביום. תואם לשעות פעילות רגילות. |
| 17:00–23:00 | עליה בתאונות בלילה – ירידה בערנות, צפיפות בשעות החזרה מהעבודה. |
| 00:00–06:00 | מעט תאונות בפני מיעוט כל הרכב על הכביש . |
✅ מסקנות:
- שעות היום רוויות בתנועה ולכן יש יותר תאונות.
- שעות המעבר בין יום ללילה (16:00–19:00) הן זמן סיכון גבוה.
📅 3. התפלגות לפי ימי השבוע¶
| יום בשבוע | תובנות |
|---|---|
| ראשון עד חמישי | נפח התאונות הגבוה ביותר – תואם לימי עבודה ולחץ תחבורתי |
| שישי | ירידה משמעותית בתאונות, גם ביום וגם בלילה |
| שבת | היום עם הכי מעט תאונות – כנראה עקב תנועה מופחתת |
✅ מסקנות:
- שיא התאונות מתרחש באמצע השבוע, בשעות הנסיעה לעבודה והחזרה לבית.
- שישי־שבת רגועים יותר – פחות תנועה, פחות עומס, ולכן פחות תאונות.
🚘 4. סוגי תאונות עיקריים – יום מול לילה¶
| סוג תאונה | בולטות ביום | בולטות בלילה | תובנות |
|---|---|---|---|
| פגיעה בהולך רגל במעבר חציה | גבוהה מאוד | נמוכה יחסית | נפוצה ביום עקב פעילות עירונית רגלית |
| התנגשויות צד לצד / חזית-אחור | גבוהה | קיימת | קלאסית לעומסי תנועה |
| התנגשויות חזית-צד / עם עצם דומם | קיימת | בולטת בלילה | לרוב בלילה – פחות רכבים, חשכה |
✅ מסקנות:
- ביום – תאונות קלאסיות של עומס ופעילות עירונית.
- בלילה – יותר תאונות מסוג התנגשות עם עצם דומם וחזית מאחורה.
🧠 מסקנות כוללות¶
- שעות השיא ביום (בוקר ואחר צהריים) הן זמני סיכון גבוה.
- יש שוני באופי התאונות בין יום ללילה – ביום יותר מעורבות הולכי רגל .
🚦 המלצות ולקחים¶
- 🔅 הגברת מודעות ביום – במיוחד בשעות הבוקר ואחה"צ.
- 🌙 נהיגה זהירה בלילה – התאמות תאורה, הימנעות מנהיגה בעייפות.
- 👮 אכיפה ממוקדת לפי שעות וסוגי תאונה – למשל, יותר נוכחות משטרתית בצמתים בשעות שיא.
- 🚸 הגנה על הולכי רגל ביום – בפרט באזורים עירוניים ובמעברי חציה.
- 📆 פעולות הסברה בימי ראשון–חמישי – ריכוז מאמצי מניעה בשיאי התאונות.
פילוח הנתונים לפי שעת התאונה¶
# התפלגות תאונות לפי שעות (אם העמודה 'SHAA' מספרית)
accdata['SHAA_CLEAN'] = pd.to_numeric(accdata['SHAA_CLEAN'], errors='coerce')
plt.figure(figsize=(12, 6))
sns.histplot(accdata['SHAA_CLEAN'].dropna(), bins=24, kde=False, color='steelblue')
plt.title(reshape_hebrew("מספר תאונות לפי שעה ביום"))
plt.xlabel(reshape_hebrew("שעה"))
plt.ylabel(reshape_hebrew("מספר תאונות"))
plt.xticks(range(0, 24))
plt.tight_layout()
plt.show()
accdata['SUG_TEUNA_HE'] = accdata['SUG_TEUNA'].map(hebrew_map)
pivot_hour_accident = accdata.pivot_table(
index='SHAA_CLEAN',
columns='SUG_TEUNA_HE',
values='pk_teuna_fikt',
aggfunc='count',
fill_value=0
)
plt.figure(figsize=(16, 8))
sns.heatmap(pivot_hour_accident.T, cmap='YlOrRd', cbar_kws={'label':reshape_hebrew('מספר תאונות')})
plt.title(reshape_hebrew('התפלגות סוגי תאונות לפי שעות היום'))
plt.xlabel(reshape_hebrew('שעה'))
plt.ylabel(reshape_hebrew('סוג תאונה'))
plt.show()
🔹 מסקנה¶
בבדיקה זו נבחן את כמות התאונות לאורך השנים 2021–2023, ונשווה בין סוגי התאונות בשעות היום לעומת שעות הלילה.
המטרה היא להבין האם קיימת מגמה של עלייה/ירידה בתאונות לאורך זמן, והאם תנאי התאורה (יום/לילה) משפיעים על רמת הסיכון בכבישים.
✅ תובנות מהנתונים:¶
- ניכרת שכיחות גבוהה יותר של תאונות בשעות היום לעומת שעות הלילה.
📌 השלכות:¶
- ריבוי תאונות ביום עשוי לנבוע מהיקף נסיעות גבוה יותר, ריבוי הולכי רגל, ועומסים בשעות השיא – ולכן יש מקום להשקיע בפתרונות ניהול עומסים ושיפור תשתיות באור יום.
- יש להמשיך לעקוב אחרי הנתונים בשנים הבאות כדי להבין האם מדובר במגמה ארוכת טווח או בחריג נקודתי.
🔹 באילו חודשים יש ריכוז גבוה של תאונות?¶
# יצירת טבלת heatmap לפי חודש ויום בשבוע
heatmap_data = accdata.groupby(['HODESH_TEUNA_y', 'YOM_BASHAVUA']).size().unstack(fill_value=0)
# תיקון עברית באינדקסים
heatmap_data.index = [reshape_hebrew(idx) for idx in heatmap_data.index]
heatmap_data.columns = [reshape_hebrew(col) for col in heatmap_data.columns]
# ציור ה־heatmap
plt.figure(figsize=(14, 8))
ax = sns.heatmap(heatmap_data, cmap='Reds', annot=True, fmt='d', linewidths=0.5, linecolor='gray')
# עיבוד מחדש של תוויות הצירים אחרי הציור
ax.set_xticklabels([reshape_hebrew(label.get_text()) for label in ax.get_xticklabels()], rotation=45, ha='right')
ax.set_yticklabels([reshape_hebrew(label.get_text()) for label in ax.get_yticklabels()], rotation=0)
# כותרות
plt.title(reshape_hebrew("התפלגות תאונות לפי חודש ויום בשבוע"), fontsize=16)
plt.xlabel(reshape_hebrew("יום בשבוע"))
plt.ylabel(reshape_hebrew("חודש"))
# פריסה יפה
plt.tight_layout()
plt.show()
# מיפוי קיצורי ימי השבוע לשמות מלאים
day_map_custom = {
'ינש': 'ראשון',
'ןושאר': 'שני',
'ישילש': 'שלישי',
'יעיבר': 'רביעי',
'ישימח': 'חמישי',
'ישיש': 'שישי',
'תבש': 'שבת'
}
day_order = ['ראשון', 'שני', 'שלישי', 'רביעי', 'חמישי', 'שישי', 'שבת']
# הנחה: העמודה 'SHNAT_TEUNA_x' מכילה את שנת התאונה
years = sorted(accdata['SHNAT_TEUNA_x'].dropna().unique())
for year in years:
# סינון לפי שנה
yearly_data = accdata[accdata['SHNAT_TEUNA_x'] == year]
# יצירת טבלת heatmap לפי חודש ויום בשבוע (קיצורי ימים)
heatmap_data = yearly_data.groupby(['HODESH_TEUNA_y', 'YOM_BASHAVUA']).size().unstack(fill_value=0)
# ממפים את עמודות הימים לשמות מלאים
heatmap_data.columns = [day_map_custom.get(day, day) for day in heatmap_data.columns]
# מסדרים את העמודות לפי סדר ימי השבוע
heatmap_data = heatmap_data.reindex(columns=day_order)
# עיצוב עברית לעמודות ולשורות
heatmap_data.columns = [reshape_hebrew(day) for day in heatmap_data.columns]
heatmap_data.index = [reshape_hebrew(str(month)) for month in heatmap_data.index]
# ציור הגרף
plt.figure(figsize=(14, 8))
ax = sns.heatmap(
heatmap_data,
cmap='Reds',
annot=True,
fmt='d',
linewidths=0.5,
linecolor='gray'
)
# תיקון תוויות הצירים אחרי הציור
ax.set_xticklabels([label.get_text() for label in ax.get_xticklabels()], rotation=45, ha='right')
ax.set_yticklabels([label.get_text() for label in ax.get_yticklabels()], rotation=0)
# כותרות
plt.title(reshape_hebrew(f"התפלגות תאונות לפי חודש ויום בשבוע לשנת {year}"), fontsize=16)
plt.xlabel(reshape_hebrew("יום בשבוע"))
plt.ylabel(reshape_hebrew("חודש"))
plt.tight_layout()
plt.show()
✅ תובנות מהנתונים:¶
- החודשים עם מספר התאונות הגבוה ביותר הם: מאי (5), יוני (6), יולי (7), ואוגוסט (8) – אלו חודשי הקיץ והחופשות, המאופיינים בריבוי נסיעות, חופשות משפחתיות, תנועת הולכי רגל רבה יותר, ולעיתים עומסים בכבישים.
- ימי השבוע עם המספר הגבוה ביותר של תאונות ברוב החודשים הם ראשון, וחמישי – כנראה עקב עומסי תנועה בתחילת שבוע העבודה ובסופו.
- בימי שבת נרשמות לרוב פחות תאונות – ייתכן בשל ירידה בפעילות התחבורתית והעדר תחבורה ציבורית.
📌 השלכות:¶
- בחודשי הקיץ יש מקום להגביר את ההסברה וזהירות בדרכים, במיוחד לקראת חופשות, טיולים ואירועים.
- בתחילת השבוע ובחמישי נדרשת אכיפה מוגברת וניהול תנועה חכם, בפרט באזורים עירוניים ובין־עירוניים מרכזיים.
- ייתכן שנדרש תכנון עומסים תחבורתיים מחדש (למשל שעות גמישות למקומות עבודה/חינוך), כדי להפחית את הסיכון באותם ימים רגישים.
ניתוח שכיחות סוגי רכבים בתאונות לפי שעת התאונה:¶
vehicle_hour_analysis = accdata.groupby(['SUG_REHEV_LMS', 'SHAA_CLEAN']).size().unstack(fill_value=0)
peak_hours_df = pd.DataFrame([
{
'סוג רכב': vehicle,
'שעה מסוכנת': f"{vehicle_hour_analysis.loc[vehicle].idxmax()}:00",
'מספר תאונות': vehicle_hour_analysis.loc[vehicle].max()
}
for vehicle in vehicle_hour_analysis.index
])
# מיון לפי מספר תאונות בסדר יורד
peak_hours_df = peak_hours_df.sort_values(by='מספר תאונות', ascending=False)
# יצירת אינדקס חדש עם מספרים רצופים החל מ-1
peak_hours_df.index = range(1, len(peak_hours_df) + 1)
peak_hours_df
| סוג רכב | שעה מסוכנת | מספר תאונות | |
|---|---|---|---|
| 1 | רכב נוסעים פרטי | 16:00 | 7290 |
| 2 | אחר ולא ידוע | 16:00 | 761 |
| 3 | אוטובוס | 14:00 | 654 |
| 4 | אופנוע 51 עד 125 סמ"ק | 14:00 | 315 |
| 5 | אופנוע 126 עד 400 סמ"ק | 16:00 | 298 |
| 6 | משא עד 3.5 טון - אחוד (טרנזיט) | 16:00 | 249 |
| 7 | משא עד 3.5 טון - לא אחוד (טנדר) | 15:00 | 202 |
| 8 | אופנוע 401+ סמ"ק | 16:00 | 189 |
| 9 | מונית | 15:00 | 186 |
| 10 | משא 3.6 עד 9.9 טון | 14:00 | 178 |
| 11 | אופניים חשמליים | 15:00 | 144 |
| 12 | משא 16.0 עד 33.9 טון | 8:00 | 133 |
| 13 | קורקינט חשמלי | 17:00 | 111 |
| 14 | אופניים | 16:00 | 103 |
| 15 | אוטובוס זעיר | 8:00 | 95 |
| 16 | אופנוע עד 50 סמ"ק | 18:00 | 61 |
| 17 | טרקטור | 13:00 | 51 |
| 18 | משא 10.0 עד 12.0 טון | 10:00 | 45 |
| 19 | משא 34.0+ טון | 10:00 | 44 |
| 20 | משא 12.1 עד 15.9 טון | 10:00 | 34 |
| 21 | קלנועית חשמלית | 13:00 | 21 |
| 22 | רכבת | 13:00 | 18 |
| 23 | רכב עבודה | 8:00 | 14 |
ניתוח נתוני תאונות דרכים בישראל – סיכום¶
🚗 1. סוג התאונה מול סוג הדרך¶
מטרת הניתוח: להבין כיצד סוגי התאונות משתנים בהתאם לסוגי הדרכים (כביש עירוני, בין עירוני).
מתודולוגיה:
- סינון וסיווג הנתונים לפי תיעוד סוג התאונה וסוג הכביש.
- השוואת שכיחות כל סוג תאונה בין סוגי דרכים שונים.
- ניתוח סטטיסטי לזיהוי מובהקות הבדלים.
ממצאים:
- פגיעת אחור – נצפתה בעיקר בכבישים עירוניים ובשעות עומס, כנראה עקב תנועה צפופה ועיכובים פתאומיים.
- התנגשות צד – נפוצה בצמתים עירוניים עם תנועה רבה ופניות מרובות.
- תאונות עם הולכי רגל – נפוצות בעיקר באיזורים עירוניים.
משמעות:
- יש צורך בהתמקדות בהפרדה ברורה של נתיבי תנועה בעיר, שיפור תאורה וציון צמתים מסוכנים.
- תכנון מחדש של צמתים עירוניים עם התאמה להאטת תנועה ופניות בטוחות.
📅 2. התפלגות תאונות לפי זמן¶
מטרת הניתוח: לזהות מתי ולמה מתרחשות התאונות לפי זמנים שונים – ימי השבוע, חודשים, עונות, ושנים.
מתודולוגיה:
- איסוף וניתוח הנתונים לפי תאריך ושעה.
- הצגת הנתונים בגרפים (line charts, heatmaps) להצגת שיאי תאונות.
- ניתוח מגמות רב-שנתיות (trend analysis).
ממצאים:
- ימי חול: שיעור תאונות גבוה יותר בהשוואה לסופי שבוע, כנראה עקב תנועה עסקית ותנועת עבודה מוגברת.
- ימי חמישי וראשון: זוהו כשיאים בתאונות, ככל הנראה עקב עומסי תנועה בסופי שבוע, חזרה מהחופשות, והיערכות לפסחאות.
משמעות:
- שימוש במידע לזיהוי זמנים קריטיים בהם יש להגביר אכיפה וחינוך.
- אפשרות לתזמן פעילויות מניעה והסברה במועדים רגישים.
👮 3. כמות תאונות לפי יחידת משטרה ואזור גאוגרפי¶
מטרת הניתוח: לזהות האם יש פערים משמעותיים בין יחידות משטרה שונות מבחינת נפח ותדירות תאונות.
מתודולוגיה:
- מיפוי גאוגרפי של נתוני תאונות לפי אזורי שיפוט.
- השוואה סטטיסטית בין יחידות.
ממצאים:
- אזורים עירוניים גדולים הציגו נפח תאונות גבוה במיוחד.
- ישנם גם אזורים עם מספר תאונות נמוך יחסית, מה שיכול להצביע על שיפור תשתיות ואכיפה.
משמעות:
- הפניית משאבים מוגברת לאזורים בעייתיים – תשתיות, אכיפה, חינוך.
- המלצה להרחבת המיפוי והעדכון התדיר של הנתונים להמשך מעקב.
🧠 תובנות עיקריות – הרחבה¶
חינוך והסברה:
- פיתוח תכניות הדרכה ממוקדות לנהגים, עם דגש על שמירת מרחק, עירנות בנהיגה, ובעיקר בעיר.
- קמפיינים תקופתיים המותאמים לזמנים שבהם הסיכון גבוה.
שיפור תשתיות:
- שדרוג צמתים ודרכים במיקומים שהוגדרו כנקודות חמות.
- התקנת רמזורים חכמים, תאורה משופרת, והוספת תשתיות להולכי רגל .
אכיפה ממוקדת:
- תכנון אסטרטגי של ניידות משטרתית בזמנים ואזורים רגישים.
- שימוש במידע סטטיסטי לקביעת מיקומי פקחים ומצלמות מהירות.
שימוש בנתונים להחלטות עתידיות:
- הטמעת מערכת ניתוח נתונים חיה שתאפשר זיהוי שינויים ודינמיקה בזמן אמת.
- שילוב מערכות חכמות ברכבים ובתשתיות עירוניות למניעת תאונות.
🤝 חוויית העבודה בצוות – פירוט¶
שיתוף פעולה למידה ופיתוח:
- חילופי ידע ות בתחומים שונים חיזקו את ההבנה הכללית.
- ניתוח ביקורתי של הנתונים והנחות העבודה.
- דיונים פתוחים שהובילו לשיפורים במודלים ולתיקון טעויות.
מיומנויות שהתפתחו:
- עבודה עם כלים מתקדמים לניתוח וויזואליזציה.
- חיזוק החשיבה האנליטית והביקורתית.
- פיתוח יכולת הצגה ושכנוע מול קהל.
🏁 לסיכום מפורט¶
הפרויקט הצליח לא רק לזהות דפוסים ומגמות מרכזיות בנתוני תאונות הדרכים בישראל, אלא גם להציע פתרונות וצעדים פרקטיים לשיפור הבטיחות בכבישים. העבודה המשותפת אפשרה למצות את הפוטנציאל של הנתונים ולהפוך אותם למידע בעל ערך ממשי לתכנון ולמדיניות ציבורית.
התובנות שהופקו ממחישות את הצורך המשולב בחינוך, תשתיות ואכיפה, כמו גם את הכוח שטמון בניתוח נתונים מתקדם ככלי לקבלת החלטות מושכלות ויעילות.